iOS开发实战 - +load和+initialize

+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 函数之前发生了什么

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容