您的位置:首页 > 其它

Runtime 交换方法

2016-05-16 15:08 316 查看
创建UIImage分类
UIImage+Image.h
#import<UIKit/UIKit.h>

@interfaceUIImage (Image)

+ (__kindof UIImage*)xmg_imageNamed:(NSString*)imageName;

@end

UIImage+Image.m
#import"UIImage+Image.h"

#import<objc/message.h>

@implementationUIImage (Image)
//加载这个分类的时候调用
+ (void)load
{

//交换方法实现,方法都是定义在类里面
// class_getMethodImplementation:获取方法实现
// class_getInstanceMethod:获取对象
// class_getClassMethod:获取类方法
// IMP:方法实现

// imageNamed
// Class:获取哪个类方法
// SEL:获取方法编号,根据SEL就能去对应的类找方法
MethodimageNameMethod =class_getClassMethod([UIImageclass],@selector(imageNamed:));

// xmg_imageNamed
Methodxmg_imageNamedMethod =class_getClassMethod([UIImageclass],@selector(xmg_imageNamed:));

//交换方法实现
method_exchangeImplementations(imageNameMethod, xmg_imageNamedMethod);

}

//运行时
//先写一个其他方法,实现这个功能
//在分类里面不能调用super,分类木有父类
//+ (UIImage *)imageNamed:(NSString *)name
//{
//    [super im]
//}

+ (UIImage*)xmg_imageNamed:(NSString*)imageName
{
// 1.加载图片
UIImage*image = [UIImagexmg_imageNamed:imageName];

// 2.判断功能
if(image ==nil) {
NSLog(@"加载image为空");
}

returnimage;
}

@end

方法调换调用
#import"ViewController.h"

//#import "UIImage+Image.h"

@interfaceViewController()

@end

@implementationViewController

- (void)viewDidLoad {
[superviewDidLoad];

//UIImage *image = [UIImage imageNamed:@"123"];
// 1.每次使用,都需要导入头文件
// 2.当一个项目开发太久,使用这个方式不靠谱
[UIImageimageNamed:@"123"];

// imageNamed:
//实现方法:底层调用xmg_imageNamed

//本质:交换两个方法的实现imageNamed和xmg_imageNamed方法
//调用imageNamed其实就是调用xmg_imageNamed

}


源自小马哥教学视频
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: