1.iOS系统首先会加载解析该app的info.plist文件,因为info.plist中包含了支持app加载进行所需要的众多key value配置信息。比如app的运行条件(required device capabilities),是否全屏,app启动图信息等。
2.创建沙盒-iOS8以后,每次启动app都会创建新的沙盒路径,所以我们存储文件时要用相对路径,否则重新启动app后沙盒路径发生变化,会读取不到数据。
3.根据info.plist的配置检查相应权限状态
4.加载MachO文件读取dyld路径,并运行dyld动态连接器(内核加载了主程序,dyld只会负责动态库的加载)
- 首先dyld会寻找合适的cpu运行环境
- 然后加载程序运行所需的依赖库和我们自己写的.h .m文件编译成的.O可执行文件,并对这些库进行链接
- 加载所有方法(runtime就是在这个时候被初始化并完成OC的内存布局)
- 加载C函数
- 加载category的扩展(此时runtime会对所有类结构进行初始化)
- 加载C++静态函数,加载OC的+load方法
- 最后dyld返回main函数地址,main函数被调用
由此可延伸出另外两个问题,可以参看我的其他文章:
MachO文件的结构:MachO文件的结构
启动优化可以怎么做:iOS App启动优化
网友评论