Runtime第六篇-Method Swizzling

Method Swizzling被称为runtime的黑魔法。swizzle在英文中的本意是“搅和”。

Method Swizzling是改变一个selector的实际实现的技术。通过这一技术,我们可以在运行时通过修改类的Method链表中selector对应的imp,来修改方法的实现。

具体实现分以下几种情况:

1,如果两个selector实现都存在,那么直接调用

void method_exchangeImplementations(Method m1, Method m2);//参数m1和m2可以分别通过两个selector,Method class_getInstanceMethod(Class clz, SEL sel);来获得。

2,如果只有一个selector实现存在,另一个不存在。

那么首先给class增加这个方法,

bool class_addMethod(Class clz, SEL sel, IMP imp, char* types);这里的imp必须是另一个实现的imp。

再通过

IMP class_replaceMethod(Class clz, SEL sel, IMP imp, char* types); imp是原始实现。

黑魔法使用中需要注意的问题

1,方法imp交换逻辑要在class的+ (void) load;方法中。因为这个方法执行最早。

2,方法imp交换逻辑要在dispatch_once里面执行。保证这个逻辑在多线程的环境下只执行一次。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,800评论 0 9
  • 我们常常会听说 Objective-C 是一门动态语言,那么这个「动态」表现在哪呢?我想最主要的表现就是 Obje...
    Ethan_Struggle阅读 6,568评论 0 7
  • 继上Runtime梳理(四) 通过前面的学习,我们了解到Objective-C的动态特性:Objective-C不...
    小名一峰阅读 4,110评论 0 3
  • Method Swizzling参考资料 1.用到的运行时基础知识介绍 SEL : 方法选择器,SEL是函数ob...
    shannoon阅读 5,195评论 0 7
  • 转载:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麦子阅读 4,099评论 0 2