美文网首页
Runtime第六篇-Method Swizzling

Runtime第六篇-Method Swizzling

作者: lzh_coder | 来源:发表于2017-09-21 11:16 被阅读6次

    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里面执行。保证这个逻辑在多线程的环境下只执行一次。

    相关文章

      网友评论

          本文标题:Runtime第六篇-Method Swizzling

          本文链接:https://www.haomeiwen.com/subject/cojzsxtx.html