上一节我们已经把APP的启动大致概括为dyld,runtime, main这三阶段,那接下来我们具体看看这三个阶段都在做些什么事情
第一阶段dyld(dynamic link editor),
Apple的动态链接器,可以用来装载Mach-O文件(可执行文件、动态库等)
- 启动APP时,
dyld所做的事情有- 装载APP的可执行文件,同时会递归加载所有依赖的动态库
- 当
dyld把可执行文件、动态库都装载完毕后,会通知Runtime进行下一步的处理
第二阶段 runtime
- 启动APP时,
runtime所做的事情有- 调用
map_images进行可执行文件内容的解析和处理 - 在
load_images中调用call_load_methods,调用所有Class和Category的+load方法 - 进行各种objc结构的初始化(注册Objc类,初始化类对象等等)
- 调用C++静态初始化器和
__attribute__((constructor))修饰的函数
- 调用
到此为止,可执行文件和动态库中所有的符号(Class,Protocol,Selector,IMP,...)都已经按格式成功加载到内存中,被runtime所管理
第三阶段 main
- 总结一下
- APP的启动由
dyld主导,将可执行文件加载到内存,顺便加载所有依赖的动态库 - 并由
runtime负责加载成objc定义的结构 - 所有初始化工作结束后,
dyld就会调用main函数 - 接下来就是
UIApplicationMain函数,APPDelegate的application:didFinishLaunchingWithOptions:方法
- APP的启动由
接下来我们来看看如何进行优化
APP的启动优化
按照不同的阶段来展开
dyld
- 减少动态库、合并一些动态库(定期清理不必要的动态库)
- 减少
Objc类、分类的数量、减少Selector数量(定期清理不必要的类、分类) - 减少
C++虚函数的数量 Swift尽量使用Struct
runtime
- 用
+initialize方法和dispatch_once取代所有的__attribute__((constructor))、C++静态构造器、Objc的+load
- 用
main
- 在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在
finishLaunching方法中 - 按需加载
- 在不影响用户体验的前提下,尽可能将一些操作延迟,不要全部都放在
One More Thing
点击查看 2020—课程列表 全网IT各种资源有需求的可以微我,或者你喜欢的课程都可以给我发链接剩下的我来搞定
喜欢的朋友可以扫描关注我的公众号(多多点赞,多多打赏,您的支持是我写作的最大动力)关注有福利可以使用免费梯子自由上网






