前言
这系列文章是根据阅读学习【iOS开发高手课】归纳总结整理的。
App启动速度的快慢往小了说是影响用户体验,往大了说是将用户拒之门外。启动速度优化的重要性不言而喻。
启动
- 冷启动:App点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动的情况。这是一次完整的启动过程。
- 热启动:App在冷启动之后用户将App退到后台,在App的进程还在系统里的情况下,用户重新启动进入App的过程,这个过程做的事情非常少。
那么到这里,针对App启动速度怎么做优化,我们应该关注App的冷启动和热启动,减少冷启动,尽量让App在后台时能通过热启动打开。怎么理解呢?对于iOS,系统严格管控手机的内存,当发现内存不足时,系统会发送全局通知,让大家把不要的内存释放出来,如果大家都不释放,后台的应用就会被干掉,当然前台的应用如果占用内存超过阈值的话也会被干掉(kill)。所以,解决App启动速度怎么做优化,我们在写代码时,能注意到App内存使用情况,节省内存空间,减少不必要的内存创建,及时地释放内存等,都是对优化起到举足轻重的作用。
以上就是冷启动和热启动。接下来我们主要讨论App冷启动的优化
App的启动主要包括三个阶段
main()函数执行前
在执行main()函数前,系统主要做以下几件事情:
- 加载可执行文件(App的.o文件的集合);
- 加载动态链接库,进行rebase指针调整和bind符号绑定;
- Objc运行时的初始处理,包括Objc相关类的注册、category注册、Selector唯一性检查等;
- 初始化,包括了执行+load()方法,attribute((constructor)) 修饰的函数的调用、创建 C++ 静态全局变量。
相应地,这个阶段对于启动速度优化来说,可以做的事情包括:
- 减少动态库加载。每个库本身都有依赖关系,苹果公司建议使用更少的动态库,并且建议在使用动态库的数量较多时,尽量将多个动态库进行合并。数量上,苹果公司最多可支持6个非系统动态库合并为一个。
- 减少加载启动后不会去使用的类或方法。
- +load()方法里的内容可以放到首屏渲染完成后再去执行,或使用+initialize() 方法替换掉。因为,在一个+load()方法里,进行运行时方法替换操作会带来4毫秒的消耗。不要小看这4毫秒,积少成多,执行 +load() 方法对启动速度的影响会越来越大。
- 控制C++全局变量的数量。
main()函数执行后
main()函数执行后的阶段,指的从main()函数执行开始,到appDelegate的didFinishLaunchingWithOptions方法里首屏渲染相关方法执行完成。
首页的业务代码都是要在这个阶段,也就是首屏渲染前执行的,它主要包括了:
- 首屏初始化所需配置文件的读写操作;
- 首屏列表数据的获取;
- 首屏渲染的大量计算等。
相应的优化:
从功能上梳理出哪些是首屏渲染必须的初始化功能,哪些是App启动必要的初始化功能,而哪些是只需要在对应功能开始使用时才需要初始化的,梳理完之后,将这些功能放在合适的时机进行。
首屏完成渲染后
首屏渲染后的这个阶段,主要完成的是非首屏其他业务服务模块的初始化、监听的注册、配置文件的读取等。从函数上看,这个阶段指的就是截止到didFinishLaunchingWithOptions方法作用域内执行首屏渲染之后的所有方法执行完成。简单的说,就是从渲染完成时开始,到didFinishLaunchingWithOptions方法作用域结束时结束。
这个阶段用户已经能够看到App的首页信息了,所以优化的优先级排在最后。但是,那些会卡主主线程的方法还是需要最优先处理的,不然还是会影响到用户后面的交互操作。
明白了App启动阶段完成的工作后,我们就可以有的放矢的进行启动速度的优化了,主要包括功能级别和方法级别的启动优化。
功能级别的启动优化
方法级别的启动优化
最后更新: 2023年12月03日 19:33:08
本文链接: http://example.com/post/f5f2ab0f.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!