方法交换 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