上一节我们已经把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各种资源有需求的可以微我,或者你喜欢的课程都可以给我发链接剩下的我来搞定
喜欢的朋友可以扫描关注我的公众号(多多点赞,多多打赏,您的支持是我写作的最大动力)关注有福利可以使用免费梯子自由上网