一、“冷启动”与“热启动”
冷启动:
App
点击启动前,此时App
的进程还不在系统里。
需要系统新创建一个进程分配给App
。(这是一次完整的App
启动过程)热启动:
App
在冷启动后用户将App
退回后台,此时App
的进程还在系统里。
用户重新返回App
的过程。(热启动做的事较少)
二、App的完整启动流程(冷启动流程)
1、main()
函数执行前(pre-main阶段)我们可以通过设置环境变量DYLD_PRINT_STATISTICS来起到监控
main()
函数执行前启动时间打印出来时间解释如下:
dylib loading time
:动态库的载入耗时,苹果建议项目中自定义的动态库最好不要超过6个动态库,如果超过了6个要考虑动态库合并;rebase/binding time
:偏移修正
(rebase)和符号绑定
(binding)的耗时;偏移修正是一个安全机制--ASLR
,原理是生成一个随机值,加到应用内存地址的前面,来起到方法、函数的地址随机的目的,解决安全问题.所有的方法、函数和数据的内存地址都会在原有的真实地址上加上这个随机值
,并且每次启动的时候这个随机值是不同的,这样别人就没法拿到方法、函数或数据的真实地址了;符号绑定是指将方法名与方法的实现,即sel和IMP的绑定。ObjC setup time
:Object-C类的注册的耗时;不权威统计,每增加20000个类,这个时间增加800ms;减少类的数量可以减少启动耗时;initializer time
:load方法和构造方法的耗时.所以项目中要尽量减少重写load 方法,将load方法的操作放在initialization中.
2、main()
函数执行后(从main
函数执行,到didFinishLaunchWithOptions
方法作用域结束)优化方向:
- 减少数据的加载,最好使用懒加载,如一个第三文库的加载;
- 将项目中不再使用的类和方法去掉;
- 使用多线程技术加载数据,充分利用cpu的资源;
- 启动时刻的界面,不要使用storyboard或xib,尽量使用纯代码,因为storyboard或xib有一步代码转换的操作,也是会耗时的。