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

     

     

  • 相关阅读:
    N个数求和
    求整数段和
    连续因子
    L1-005 考试座位号
    PTA Java tips(转载)
    个位数统计
    flink编译支持CDH6.2.0(hadoop3.0.0)
    hdfs/hbase 程序利用Kerberos认证超过ticket_lifetime期限后异常
    spring boot通过@Bean注解定义一个Controller
    【TypeScript】TypeScript 学习 2——接口
  • 原文地址:https://www.cnblogs.com/110-913-1025/p/14553922.html
Copyright © 2020-2023  润新知