名称 | 区别 |
冷启动 | 启动时,App的进程不在系统里,需要开启新进程。 |
热启动 | 启动时,App的进程还在系统里,不需要开启新进程。 |
主要分为三个阶段:
- main() 函数执行前(pre-main阶段)
- main() 函数执行后(从main函数执行,到设置self.window.rootViewController执行完成)
- 首屏渲染完成后(从self.window.rootViewController执行完成到didFinishLaunchWithOptions方法作用域结束)
main() 函数执行前(pre-main阶段)
- App启动后,首先,系统内核(Kernel)创建一个进程。
- 其次,加载可执行文件。(可执行文件是指MachO格式的文件,也就是App中所有.o文件的集合体)这时,能获取到dyld(dyld是苹果的动态链接器)的路径。
- 然后,加载dyld,主要分为4步:
- 1 . load dylibs:这一阶段dyld会分析应用依赖的dylib,找到其mach-o文件,打开和读取这些文件并验证其有效性,接着会找到代码签名注册到内核,最后对dylib的每一个segment调用mma。
- 2 . rebase/bind:进行rebase指针调整和bind符号绑定。
- 3 . ObjC setup:runtime运行时初始化。包括ObjC相关Class的注册、category注册、selector唯一性检查等。
- 4 . Initializers:调用每个ObjC类与分类的+load方法,调用attribute((constructor))修饰的函数、创建C++静态全局变量。
main函数执行后:
- main函数执行后的阶段,指的是:从 main 函数执行开始,到AppDelegate 的 didFinishLaunchingWithOptions方法里首屏渲染相关方法执行完成。即,从main函数执行到设置self.window.rootViewController执行完成的阶段。
- 首屏初始化所需配置文件的读写操作;
- 首屏列表大数据的读取;
- 首屏渲染的大量计算;
首屏渲染完成后:
-
- 首屏渲染完成后的阶段,指的是:didFinishLaunchingWithOptions方法作用域内执行首屏渲染后的所有方法执行。即从设置self.window.rootViewController到didFinishLaunchWithOptions方法作用域结束。
- 这个阶段,首屏已经渲染完成。
- 需要做的事:
- 初始化一些首屏展示不需要的功能。
- 优化主线程,先处理会卡住主线程的方法,不能影响到用户的后续操作。