一, Runtime 交换方法
场景:一般加载图片的时候会有一个placeholder图片,默认图片加载,如果说加载失败就会手动去设置这个默认图片,如果加载图片多,就需要手动加载很多位置
用runtime机制里面的交换方法,即可省去加载默认图片
实现思路:UIImage图片有一个imageNamed的方法 我们只需要写一个方法与此来交换,在加载失败的情况默认显示我们那个方法里面的默认图片
实现步骤:
1,新建一个Objective - C File 文件 file 规范些category file type选择Category class:UIImage 即可
.h文件需要写一个方法 注意;要与系统的方法区分,加个前缀即可
如:+ (UIImage *)LL_imageNamed:(NSString *)name;
.m文件
#import <objc/message.h> //引入runtime
load 是只要类所在文件被引用就会被调用 自动调用 只调用一次
+ (void)load{
//方法交换 就要用Method去拿到系统方法 imageNamed 和 当前手动写的方法LL_imageNamed
Method imagenameMethod = class_getClassMethod(self, @selector(imageNamed:));//拿到系统方法
Method LL_imageNameMethod = class_getClassMethod(self, @selector(LL_imageNamed:));//拿到手动写的方法
//runtime进行交换即可 完成交换动作
method_exchangeImplementations(imagenameMethod, LL_imageNameMethod);
}
//实现方法
+ (UIImage *)LL_imageNamed:(NSString *)name{
UIImage *image = [UIImage LL_imageNamed:name];
if(nil == image){
//加载失败 在这里做你想做的
/** 如果图片加载失败 显示默认的图片 **/
image = [UIImage LL_imageNamed:@"moren.jpg"];
}
return image;
}
写到这的时候 runtime的交换方法可以写完
回到vc页面 直接调用
/** 图片加载失败 通过runtime设置默认图片 **/
self.showimage = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];
//imageNamed 已经被我们自己写的方法给替换掉了,这里没有图片的情况下默认显示LL_imageNamed这个里面的图片
self.showimage.image = [UIImage imageNamed:@""];
[self.view addSubview:self.showimage];