方法交换 Method-Swizzling
方法1
/*
交换本质
class_getInstanceMethod(cls, selector)方法,这个方法有个特点:如果这个类(第一个参数)中没有实现selector这个方法,它返回的是它某父类的 Method 对象(沿着继承链找到为止)
*/
交换实例
#import <objc/runtime.h>
+ (void)load
{
NSLog(@"11方法交换 尝试----");
// 保证交换方法只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 获取到这个类的viewDidLoad方法 它的类型是一个objc_method结构体的指针
// 参数1 表示交换的类 参数2 交换的方法
Method viewdidload = class_getInstanceMethod(self, @selector(viewDidLoad));
// 获取到自己刚刚新建的方法
Method viewdidloadad = class_getInstanceMethod(self, @selector(viewDidLoadad));
// 互换实现
method_exchangeImplementations(viewdidload, viewdidloadad);
});
}
- (void)viewDidLoadad
{
NSLog(@"%@ did load", self);
// 调用自己原有的方法 因为已经交换,所以会掉原有的viewDidLoad方法。
[self viewDidLoadad];
}
方法2
每个方法都对应了一个imp指针,所以,我们可以直接调用方法的IMP指针,来避免方法调用死循环的问题
参考文章 http://www.cocoachina.com/articles/12623

浙公网安备 33010602011771号