iOS runtime(三)method swizzling

2018-05-02  本文已影响0人  Nomo_C

method swizzling方法交换

注意下面这句代码:originSel为当前类的父类方法时才能添加成功。如果不做此判断,子类对象是可以正常执行交换的方法的。但是由于swizzling_*方法是写在子类中的,所以父类对象会由于找不到方法,抛出异常。

BOOL methodAdded = class_addMethod(self, originSel, method_getImplementation(swizzlingMethod), method_getTypeEncoding(swizzlingMethod));

在哪里添加代码?

load or initinalize?不得不知的load与initialize

方法交换的代码最好放在load方法中执行,当前类参与编译的时候就会执行load方法,并且只执行一次。由于load方法可以手动调用,为防止特殊的情况所以加入diapatch_once。load方法不遵从类的继承规则,子类不实现load,不会去执行父类的load方法。

initialize方法:第一次执行当前类的方法时,会提前调用initalize。遵从类的继承规则,如果子类不实现initalize方法,初始化子类的时候会先初始化父类,然后会调用父类的initialize方法,而子类没有复写initialize方法,因此会再次调用父类的initialize方法。如果加在initialize中也需要使用dispatch_once。

上一篇 下一篇

猜你喜欢

热点阅读