启动过程
注: 本Blog的总结来自阅读美团iOS Team的学习,部分图片来自美团 Team(侵权删)
加载过程 从Exec()到Main()
真正的加载过程从exec()函数开始,exec()是一个系统调用。操作系统首先为进程分配一段内存空间,然后执行如下操作:
- 把App对应的可执行文件加载到内存。
- 把Dyld加载到内存。
- Dyld进行动态链接。
Dyld在各阶段处理的任务
- 加载动态库
- Rebase和Bind
- Objc setup
- 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()函数启动过程的一些因素
- 动态库越多,加载越慢
- Objc类方法越多,加载越慢
- Objc load方法越多,加载越慢
- C++静态对象越多,加载越慢
- C的Constructor方法越多,加载越慢