App 启动我们指的是从用户点击 App 开始,到用户看到第一个界面这个阶段。总结来说,App 的启动主要包括三个阶段:
1、main() 函数执行前;
2、main() 函数执行后;
3、首屏渲染完成后;
main() 函数执行前
在 main() 函数执行前,系统主要会做下面几件事情:
-
加载可执行文件(App 的 .o 文件的集合);
-
加载动态链接库,进行 rebase 指针调整和 bind 符号绑定;
-
Objc 运行时的初始处理,包括 Objc 相关类注册、category 注册、selector 唯一性检查等;
-
初始化,包括了执行 +load() 方法、attribute((constructor)) 修饰函数的调用、创建 C++ 静态全局变量;
main() 函数执行后
main() 函数执行后的阶段,指的是从 main() 函数执行开始到 appDelegate 的 didFinishLaunchingWithOptions 方法里首屏渲染相关方法执行完成。
首页的业务代码都是要在这个阶段,也就是首屏渲染前执行的,主要包括了:
-
首屏初始化所需要配置文件的读写操作;
-
首屏列表大数据的读取;
-
首屏渲染的大量计算等;
首屏渲染完成后
这个阶段主要主要指的是非首屏其他业务服务模块的初始化、监听的注册、配置文件的读取等。从函数上来看,这个阶段指的就是截止到 didFinishLaunchingWithOptions 方法作用域内执行首屏渲染之后的所有方法执行完成。简单来说,这个阶段指从渲染完成时开始,到 didFinishLaunchingWithOptions 方法作用域结束时结束。
这个阶段用户已经能够看到 App 的首页信息了,所以优化的优先级排在最后。但是,那些会卡主主线程的方法还是需要最优先处理的,不然还是会影响到用户后面的交互操作。
参考资料:
网友评论