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

 

 

原文地址:https://www.cnblogs.com/110-913-1025/p/14553922.html