Runtime的常用方法(交换方法)
举个简单的例子就是在我们调用UIImage的imageNamed方法时判断加载的图片是否成功.
-(void)viewDidLoad {
[super viewDidLoad];
// 在调用imageNamed时判断图片是否加载成功
UIImage * image = [UIImage imageNamed:@"123"];
}
判断图片是否加载成功
首先我们给UIImage创建一个分类
在.m文件中写一个我们自己的方法用来加载图片和判断是否加载成功
这里必须使用我们的Cnw_imageNamed方法进行赋值,不然会形成死循环
+(UIImage *)Cnw_imageNamed:(NSString *)name
{
UIImage * image = [UIImage Cnw_imageNamed:name];
if (image) {
NSLog(@"加载成功");
}else{
NSLog(@"加载失败 ");
}
return image;
}
在.m文件中我们来实现Runtime的方法交换
+(void)initialize
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 使用runtime方法交换
// 方法1
Method imageNamed = class_getClassMethod(self, @selector(imageNamed:));
// 需要替换的方法
Method Cnw_imageNamed = class_getClassMethod(self, @selector(Cnw_imageNamed:));
// 需要交换的两个方法
method_exchangeImplementations(imageNamed, Cnw_imageNamed);
});
}