zoukankan      html  css  js  c++  java
  • 方法交换 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

     

     

  • 相关阅读:
    9.算术运算符
    7.字符串格式化
    下载和配置JDK
    Set-常用API及详解
    List-ApI及详解
    电路交换、报文交换、分组交换比较
    集合之List—ArrayList
    java的getClass()函数
    Object类、包装类、内部类详解
    接口的探究
  • 原文地址:https://www.cnblogs.com/110-913-1025/p/14553922.html
Copyright © 2011-2022 走看看