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

     

     

  • 相关阅读:
    C#基础
    C#基础
    Sqlserver数据库备份和还原
    C#基础
    Python3学习笔记4
    Python3学习笔记3
    调用接口Post xml和json数据的通用方法
    Python3学习笔记2
    Python3学习笔记1
    常见的PHP函数代码性能对比
  • 原文地址:https://www.cnblogs.com/110-913-1025/p/14553922.html
Copyright © 2011-2022 走看看