iOS app启动速度优化总结

App 启动时

一般app分为冷启动和热启动

  • 冷启动: app点击启动前,它的进程不在系统里,需要系统新创建一个进程分配给它启动
  • 热启动,app在冷启动后用户将app退到后台,app的进程还在系统中的情况下,用户重新启动进入app的过程,当然这个过程做的事情非常少
    因此一般app启动速度都是指冷启动的优化

用户能感知到启动慢,其实都是发生在主线程上。而主线程慢的原因有很多,比如在主线程上执行大文件读写操作,在渲染周期中执行大量计算等。

app启动时的过程(用户点击app开始,到用户看到第一个界面之间的时间):
  1. main()函数执行之前;
  2. main()函数执行之后;
  3. 首屏渲染完成后。
main()函数执行之前

在main()函数执行前,系统主要会做以下几件事:

  • 加载可执行文件(app的.o文件的集合)
  • 加载动态链接库,进行rebase指针调整和bind符号绑定
  • Objc 运行时的初始处理,包括Objc相关类的注册,category注册,selector唯一性检查
  • 初始化,包括了执行 +load()方法,attribute((constructor)) 修饰的函数的调用,创建c++静态全局变量
    因此在这个阶段,对于优化启动速度如下:
  • 减少动态库加载
  • 加少加载启动后不会去使用的类或方法
  • +load() 方法里的内容可以放到首屏渲染完成后在执行,或使用 +initialize() 方法替换掉。
  • 控制 C++ 全局变量的数量
    main() 函数执行后:
    main() 函数执行后的阶段,是指从main() 函数执行开始,到AppDelegate 的 didFinishLaunchingWithOptions 方法里首屏渲染相关方法执行完成。
    首页的业务代码都是要在这个阶段(渲染前执行)
  • 首屏初始化所需配置文件的读写操作
  • 首屏列表大数据的读取
  • 首批渲染的大量计算
    因此梳理出哪些时首屏渲染必要的初始化功能,哪些是app启动必要的初始化功能,哪些是只需要在对应功能开始使用时才需要初始化的
    首屏渲染完成后
    首屏渲染后的阶段,主要完成的是,非首屏其他业务服务模块的初始化,监听的注册,配置文件的读取等,也就是 didFinishLaunchingWithOptions 作用域内执行首屏渲染之后所有方法执行完成
    这个阶段用户已经能够看到app的首页信息
总结
  • main() 函数开始执行后渲染完成前只处理首屏相关的业务,其他无关的业务放在首屏渲染完成后去做
  • 在首屏渲染完成前主线程中一个耗时的操作滞后或者通过异步执行
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一个项目做的时间长了,启动流程往往容易杂乱,库也用的越来越多,APP的启动时间也会慢慢变长。本次将针对iOS...
    酱油瓶2阅读 3,706评论 0 12
  • 爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定...
    PetitBread阅读 1,229评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,807评论 1 32
  • 序言 三种启动状态及启动过程冷启动温启动热启动 统计应用启动时间查看logcat日志adb shell am st...
    人海中一只羊阅读 6,441评论 0 6
  • 五律•冬游摇岭古道 林忠顺 曾约那个秋,此去已冬游。 茂密枫林晚,稀疏故叶飕。 摇则摇半载,落罢落一丘。 古道生情...
    林忠顺阅读 442评论 4 3

友情链接更多精彩内容