项目中使用下面这个方法很常见:
[UIImage imageNamed:@"img1"];
这个方法在图片不存在是会引起崩溃,这里先提供两种简单点的方法。
继承
+ (UIImage *)imageNamed:(NSString *)name {
    // 恢复系统做法
    UIImage *image = [super imageNamed:name];
    if ( image == nil ) {
        NSLog(@"加载失败");
        return [UIImage imageNamed:@"default"];
    }
    return image;
}
就是创建一个UIImage的子类,用子类的imageNamed:方法加载图片
分类
分类方法挺好,简洁。切记,方法名不能重复系统方法名,可以加个前缀
+ (UIImage *)TJ_imageNamed:(NSString *)name {
    // 恢复系统做法
    UIImage *image = [UIImage imageNamed:name];
    if ( image == nil ) {
        NSLog(@"加载失败");
        return [UIImage imageNamed:@"default"];
    }
    return image;
}
大家看到这儿发现与我们的runtime还没半毛钱关系,稍安勿躁。现在需求变这样:一个项目,已经开发迭代两年,以前都是用UIImage加载图片,但现在项目老大要我们对这个空图片的崩溃问题进行处理,一看看上面两个方法,懵逼中。。。。。。工程量太大,灯灯灯等!runtime登场:
流程:
 `提供分类`
 `写一个有这样功能的方法`
 `用这个方法跟系统方法进行方法交换`
分类中的新方法:
+ (void)load {
    // 获取类方法
    // class:获取哪个类的方法
    // SEL:获取哪个方法
    Method imageNameMethod = class_getClassMethod(self, @selector(imageNamed:));
    Method bj_imageNameMethod = class_getClassMethod(self, @selector(TJ_imageNamed:));
    // 交换方法的实现
    method_exchangeImplementations(imageNameMethod, TJ_imageNameMethod);
}
+ (UIImage *)TJ_imageNamed:(NSString *)name {
    UIImage *image = [UIImage imageNamed:name];
    if (image == nil) {
        NSLog(@"加载失败!\n");
        return [UIImage imageNamed:@"default"];
    }
    return image;
}
主线程直接调用:
[UIImage imageNamed:@"img1"];
方法交换示意图:

 
        
         
      
    	
    	
