iOS 启动优化总结

2019-09-21

启动过程

注: 本Blog的总结来自阅读美团iOS Team的学习,部分图片来自美团 Team(侵权删)

加载过程 从Exec()到Main()

真正的加载过程从exec()函数开始,exec()是一个系统调用。操作系统首先为进程分配一段内存空间,然后执行如下操作:

  1. 把App对应的可执行文件加载到内存。
  2. 把Dyld加载到内存。
  3. Dyld进行动态链接。

Dyld在各阶段处理的任务

  1. 加载动态库
  2. Rebase和Bind
  3. Objc setup
  4. Initializers
加载动态库 从Header中获取所需要加载的动态的所依赖动态库列表,递归依赖集合
Rebase Bind Rebase在Image内部调整指针的指向 Bind是指向Image外部的内容,指向外部的指针被Symbol绑定,Dyld要去符号表中查找对于的实现
Objc setup 注册Class 插入Category的方法列表 保证每个Selector唯一
Initializers Objc的Load方法 C++的构造函数属性函数 非基本类型的C++静态全局变量的创建(通常是类或结构体)

最后Dyld会调用main()函数,main()函数调用UIApplication()
可能影响main()函数启动过程的一些因素

  1. 动态库越多,加载越慢
  2. Objc类方法越多,加载越慢
  3. Objc load方法越多,加载越慢
  4. C++静态对象越多,加载越慢
  5. C的Constructor方法越多,加载越慢