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。