接上篇,本篇主要记录我在程序启动时间优化上的一些探索。html
要谈论时间优化,就要先了解程序启动的过程和耗时的缘由,而后针对性的进行优化。ios
程序的启动分为冷启动和热启动两种模式,其中冷启动是从程序被杀死后加载起来的过程,热启动是从后台到前台的过程。相比之下,热启动是包含在冷启动里,而且比冷启动少了部分加载过程的,因此,咱们日常说的启动优化,通常都是针对冷启动的。git
从点击程序的图标,到首页渲染完成显示到用户眼前,主要有三个阶段。github
该阶段主要进行动态连接库 (dylib) 和自身 App 可执行文件的加载。性能优化
其中动态连接库包括:iOS 中用到的全部系统 framework,加载 OC runtime 方法的 libobjc,系统级别的 libSystem,例如 libdispatch(GCD) 和 libsystem_blocks (Block)。app
该阶段主要执行 main 函数到 applicationWillFinishLaunching 方法结束。函数
该阶段主要执行首页界面 viewDidLoad 方法和 UITabBarController 第一个子控制器 viewWillAppear 里的代码。工具
加载大量动态连接库;post
注册大量Objc类 、初始化类对象 (Objc 的 +load 方法);性能
加载大量分类里的方法;
加载大量 C++ 静态对象;
执行大量声明为 attribute((constructor)) 的C函数。
在 applicationWillFinishLaunching 执行了 UITabBarController 以及 子控制器的建立,并在 viewDidLoad 方法里执行了大量的耗时操做;
大量第三方应用的配置和启动项的累积;
减小非系统库的依赖、合并不是系统库,苹果最多支持6个非系统的动态库合并为一个;
按期清理项目里不使用的类和方法,检测工具可使用AppCode,关于AppCode的使用请参考这篇文章: AppCode使用介绍;
将没必要须在+load方法中作的事情延迟到+initialize中,关于两者的区别能够参考这篇文章;
减小分类和分类里方法的数量;
尽可能不要用 C++ 虚函数;
删减一些无用的静态变量。
对启动项和第三方应用配置根据优先级区分,部分不须要在程序启动就初始化的配置,进行延后处理;
减小在viewDidLoad 里的耗时处理;
UITabBarController 第一个子控制器里的一些耗时操做能够放到 viewDidAppear 方法中,先把界面加载出来,而后再拿到数据刷新界面;
增长广告页,在这个时间内准备好首屏页面和数据;
Xcode自带的Time Profiler,具体操做能够参考这篇文章;
查询main函数以前的耗时:菜单:Product->Scheme->Edit Scheme->Environment Variables,设置:key:DYLD_PRINT_STATISTICS ,value:1。
最后郑重声明,本篇里只是记录一下个人我的理解和代码实践,资料大量参考了如下文章: