App启动时间过长,可能由多个原因造成。从理论上说,App的启动时间是由.main()函数之前的加载时间(t1)和main()函数之后的加载时间(t2)组成的。
关于t1,需要分析App的启动日志,具体方法是在Xcode中添加DYLD_PRINT_STATISTICS环境变量,并将其值设置为1,这样就可以得倒如下的启动日志: Total pre-main time: 1.3 seconds(100.0%) dylib loading time: 107.45 millseconds(8.0%) rebase/binding time:376.56 millseconds(28.2%) Objc setup time: 166.96 millseconds(12.5%) initializer time: 684.01 millseconds(51.2%) slowest intializers: libSystem.dylib: 297.56 millseconds(22.2%) libMainThreadchecker.dylib: 33.09 millseconds(2.4%) ModelIO: 189.45 millseconds(14.2%)
然后就可以知道App的启动在这三个方面--- 动态库加载,重定位/绑定及对象初始化所消耗的时间了。所以,优化的手段就有了,简单来说就是:
- 减少动态库数量,动态库加载时间货减少,苹果公司官方的推荐动态库不要多于6个
- 减少Object-C的类数量,例如合并或者删减,这样可以加快动态链接,重定位/绑定所消耗的时间会较少。
- 使用initialize方法替换成load方法,或是尽量将load方法中的代码延迟调用,对象的初始化所消耗的时间会减少。
关于T2的时间,其主要是构建第一个界面并完成渲染的时间。所以,t2需要在具体的界面布局和渲染代码中进行打点观察,诸如viewDidLoad()和viewWillAppear()这两个函数就很值得关注