main 函数
执行开始会进入到appDelegate
的 didFinishLaunchingWithOptions
方法执行
很多人在一些第三方 SDK 初始化配置,各种初始化的工作都放在appDelegate
的 didFinishLaunchingWithOptions
这个阶段执行,其实是不合理的,正确的做法应该是弄清楚哪些是APP 启动时候真正需要的初始化功能,哪些是在其对应功能开始使用时才需要初始化的,梳理完之后把他们都放在对应的阶段进行。
首屏渲染这部分的代码止于didFinishLaunchingWithOptions
方法作用于结束。因为这时候首屏已经完成了渲染,所以可以不着急立马对其优化,但是那些阻碍线程的操作还是要优先处理的。
首屏渲染完成之后的阶段应该是非首屏其他业务模块的初始化,监听的注册,配置文件的读取等等。
时间统计
可以在Edit Scheme
中添加Arguments
用来统计启动时间
添加参数DYLD_PRINT_STATISTICS
并且 value 为1
这样启动app的时候就会有时间统计
Total pre-main time: 3.3 seconds (100.0%)
dylib loading time: 551.91 milliseconds (16.4%)
rebase/binding time: 1.8 seconds (54.5%)
ObjC setup time: 754.55 milliseconds (22.5%)
initializer time: 217.73 milliseconds (6.4%)
slowest intializers :
libSystem.B.dylib : 12.87 milliseconds (0.3%)
同时这个顺序也就代表了应用启动时的执行顺序。