项目中使用下面这个方法很常见:
[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"];
方法交换示意图: