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