app的冷启动:即app从来没有打开,从点击app到看到首屏为止的这个过程,叫做app的冷启动。
应用程序的入口为main()
函数, 所以app的启动大致就分为以下几个阶段:
-
main()
函数执行之前 -
main()
函数执行之后到首屏渲染 -
main()
首屏渲染之后
那么这三个阶段app分别都做了什么工作?
-
main()
函数执行之前:- 加载可执行文件,即Mach-O文件(ipa文件打开之后有个包,包里面包含了代码签名文件夹,一堆资源文件 和 一个二进制可执行文件)
- 加载动态链接解释器dyld,以及加载依赖动态库,包括系统和自己的,执行初始化方法。进行rebase指针调整和符号绑定。
- Objc运行时的初始化,包括Objc相关类的注册,category的注册,selector唯一性检查等。
- 初始化,包括+load方法的载入,attribute修饰的函数的调用,创建C++静态全局变量。
-
main()
函数执行之后:指的是从main()
函数执行开始,到appDelegate
的didFinishLaunchingWithOpentions
方法里首屏渲染相关方法执行完成。 - 首屏渲染之后:指的是
window.rootViewController设置
到函数Appdelegate didFinishLanuchingWithOptions
方法域结束为止