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

你可能感兴趣的:(Runtime第六篇-Method Swizzling)