美文网首页
iOS开发实战 - +load和+initialize

iOS开发实战 - +load和+initialize

作者: ArchLL | 来源:发表于2019-04-03 21:32 被阅读0次

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

相关文章

网友评论

      本文标题:iOS开发实战 - +load和+initialize

      本文链接:https://www.haomeiwen.com/subject/xyptiqtx.html