交换方法
应用场景: 当第三方框架或者系统原生方法不能满足的时候,可以在原有方法的基础上,添加额外的功能.
需求: 加载一张图片直接用[UIImage imageNamed:@"image"];是无法知道到底有没有加载成功。给系统的imageNamed添加额外功能(是否加载图片成功)。
实现步骤:给UIImage添加一个分类Category
#import "UIImage+Load.h"
#import <objc/runtime.h>
#import <objc/message.h>
@implementation UIImage (Load)
//方法交换
+ (void)load {
// 1.获取 imageNamed方法地址 class_getClassMethod(获取某个类的方法)
Method imageNamedMethod = class_getClassMethod(self,@selector(imageNamed:));
// 2.获取 ln_imageNamed方法地址
Method ln_imageNamedMethod = class_getClassMethod(self,@selector(ln_imageNamed:));
// 3.交换方法地址,相当于交换实现方式; 「method_exchangeImplementations 交换两个方法的实现」
method_exchangeImplementations(imageNamedMethod, ln_imageNamedMethod);
}
+ (UIImage*)ln_imageNamed:(NSString*)name {
UIImage *image = [UIImage ln_imageNamed:name]; //注意这里
if(image) {
NSLog(@"runtime添加额外功能--加载成功");
}else{
NSLog(@"runtime添加额外功能--加载失败");
}
return image;
}
@end
当导入上面的Category头文件,调用imageNamed时,就会调用到ln_imageNamed
#import "UIImage+Load.h"
UIImage *image = [UIImage imageNamed:@"iiii"];
输出结果为:runtime添加额外功能--加载失败