一, 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];

原文地址:https://www.cnblogs.com/liaolijun/p/7895683.html