1、method-swizzling注意事项
load方法使用
1.在load方法内交换
(需要注意的是load方法是在APP加载已经加载到内存)
2.load方法是在main函数之前调用
3.自动执行的,不需要手动执行
4.唯一性,不用担心被子类覆盖
方法交换MethodSwizzling
1.比如想要系统的NSArray进行交换,那么你就应该用__NSArrayI,需要找到真正的方法的归属
2.利用单例原则保证只执行一次
3.子类没有实现父类的方法,导致调用交换,会找父类,但是父类没有swizzling的方法,会崩溃
首先要尝试给自己添加方法,确保有交换的IMP SEL-> IMP
然后再将父类的IMP给Swizzling 父类(IMP)--> swizzzling
4.交换没有实现的方法
添加一个编号的实现 即使是空的方法编号SwizzlingMethod防止递归
m_student -->helloword
helloWord --//>nil
isKindOfClass isMemberOfClass
1.isKindOfClass
源码内其实是两层循环
第一层是元类和这个类对比
第二层是元类的父类和这个类对比
2.isMemberOfClass
元类和类进行的对比
【self class】 [super class]
本质是消息的转发
【self class】
objc_msg_send (self class)
[super classs] objc_msgSend_super(&objc_super,@selector(class))
是会到父类的class但是class的消息接受者还是self类
372500FD-062C-48B1-87E7-E35212D525C8.png
网友评论