iOS的Runtime:load方法,以及load和initia
2023-04-12 本文已影响0人
jlstmac
load方法和initialize方法
load方法在runtime的初始化时调用,也就是_objc_init方法中被调用
![](https://img.haomeiwen.com/i4636189/29ea8c58bb3fa950.png)
![](https://img.haomeiwen.com/i4636189/445b2e4d46b7702c.png)
call_load_methods()函数中调用load方法。
load方法的调用顺序是先调用所有类的load方法,再调用分类的load方法。
![](https://img.haomeiwen.com/i4636189/1dd05ff4fd095a37.png)
调用load方法之前会先递归遍历其父类,先调用父类的load方法:
![](https://img.haomeiwen.com/i4636189/1c505cc3e2e37462.png)
总结load的调用特点:
1.先调用父类的load方法,再调用子类的load方法,最后调用分类的load方法。
2.对于类与类之间的先后顺序看编译顺序。
3.分类和类的load方法都会调用
4.load方法调用发生在Runtime初始化,main函数之前
load方法调用是通过函数地址调用,而非OC中常用的发送消息机制,每一个类有且只有调用一次(除非程序员主动调用)。
b.initialize方法是通过objc_msgsend方式也就是发送消息的方式调用的:
![](https://img.haomeiwen.com/i4636189/8a834ed4c604acc9.png)
![](https://img.haomeiwen.com/i4636189/67887eaecbde0592.png)
initialize的特点:
1.initialize在首次接受到消息时调用。
2.initialize通过objc_msgSend调用。所以遵循OC其他方法调用的特点。如果子类没有实现,会遍历其父类调用其父类的实现。
3.由于第二条特点,一个initialize的调用可能不止一次。
4.由于initialize是OC方法,所以如果分类实现了initialize实现会覆盖主类的实现。