+load
调用方式:根据函数地址直接调用
调用时刻:当程序启动的时候就会调用(runtime加载、分类的时候调用,且每个类只会调用一次)
调用顺序:
1.类优先分类调用+load
(会先调用所有类的+load
);
2.父类优先子类调用+load
;
3.分类+load
的执行顺序与其在Compile Sources
列表中出现的顺序一致 ⬇️;
4.不同类+load
的执行顺序与其在Compile Sources
出现的顺序一致 ⬇️;
注意:
1.+load
调用时机比较早,当+load
调用时,其他类可能还没加载完成,运行环境不安全;
2.+load
是线程安全的,要避免阻塞线程。
+initialize
调用方式:通过objc_msgSend进行调用
调用时刻:第一次接收到消息的时候调用,每个类只会initialize
一次,父类的+initialize
可能会被调用多次
调用顺序:
1.父类优先子类调用+initialize
;
2.如果子类没有实现+initialize
,会调用父类的+initialize
,所以父类的+initialize
可能会被调用多次(父类的+initialize
被调用了多次并不代表父类被初始化了多次,只是通过父类的+initialize
完成了自己的初始化);
3.分类+initialize
的调用会覆盖掉类的+initialize
的调用;
4.当同个类的多个分类都实现+initialize
时,只执行Compile Sources
列表中最后一个分类的+initialize
⬇️;
注意:
1.+initialize
收到消息时,运行环境基本安全;
2.+initialize
也是线程安全的,要避免阻塞线程。
补充:(在main
函数开始执行之前,iOS 程序 main 函数之前发生了什么)