runtime--实现篇01(Method Swizzling)
iOS中的Swizzle效果:拦截系统方法
@implementation UIImage (Extension)
/**
* 当某个类或者分类加载进内存时,会调用1次
*/
+ (void)load {
// 获取系统的方法
Method m1 = class_getClassMethod([UIImage class], @selector(imageNamed:));
// 获取自定义的方法
Method m2 = class_getClassMethod([UIImage class], @selector(test_imageNamed:));
// 交换两个方法的实现
method_exchangeImplementations(m1, m2);
}
/**
* 用于交换系统的方法
*/
+ (UIImage *)test_imageNamed:(NSString *)name {
double version = [[UIDevice currentDevice].systemVersion doubleValue];
// iso系7统的全部匹配_os7后缀的图片
if (version >= 7.0) {
// 拼接图片名称
name = [name stringByAppendingString:@"_os7"];
}
NSLog(@"%s---name:%@",__func__,name);
return [UIImage test_imageNamed:name];
}
在控制器中测试-------------------------------------
- (void)viewDidLoad {
[super viewDidLoad];
self.imageView.image = [UIImage imageNamed:@"close"];
self.imageView2.image = [UIImage imageNamed:@"fire"];
}
分析:首先调用imageNamed:方法自动交换为调用test_imageNamed:方法,故日志打印如下,通过return [UIImage test_imageNamed:name],交换后调用
imageNamed:方法,
2015-07-09 00:11:38.174 04-运行时的应用-交换系统方法[37034:421104] +[UIImage(Extension) test_imageNamed:]---name:close_os7
2015-07-09 00:11:38.180 04-运行时的应用-交换系统方法[37034:421104] +[UIImage(Extension) test_imageNamed:]---name:fire_os7