iOS 如何优化 App 的启动耗时

iOS 的 App 启动时长大概可以这样计算:

  • t(App 总启动时间) = t1(main 调用之前的加载时间) + t2(main 调用之后的加载时间)
  • t1 = 系统 dylib(动态链接库)自身 App 可执行文件的加载
  • t2 = main方法执行之后到AppDelegate类中的application:didFinishLaunchingWithOptions:方法执行结束前这段时间,主要是构建第一个界面,并完成渲染展示
  1. t1阶段加快App启动的建议:
  • 尽量使用静态库,减少动态库的使用,动态链接比较耗时,如果要用动态库,尽量将多个dylib动态库合并成一个
  • 尽量避免对系统库使用optional linking,如果App用到的系统库在你所有支持的系统版本上都有,就设置为required,因为optional会有些额外的检查
  • 减少Objective-C Class、Selector、Category的数量,可以合并或者删减一些OC
  • 删减一些无用的静态变量,删减没有被调用到或者已经废弃的方法
  • 将不必须在+load中做的事情尽量挪到+initialize中,+initialize是在第一次初始化这个类之前被调用,+load在加载类的时候就被调用。尽量将+load里的代码延后调用
  • 尽量不要用C++虚函数,创建虚函数表有开销
  • 不要使用__attribute__((constructor))将方法显式标记为初始化器,而是让初始化方法调用时才执行。比如使用dispatch_once(),pthread_once()或 std::once()
  • 在初始化方法中不调用dlopen(),dlopen()有性能和死锁的可能性
  • 在初始化方法中不创建线程
  1. t2阶段加快App启动的建议:
  • 尽量不要使用xib/storyboard,而是用纯代码作为首页UI,如果要用xib/storyboard,不要在xib/storyboard中存放太多的视图
  • application:didFinishLaunchingWithOptions:里的任务尽量延迟加载或懒加载
  • 不要在NSUserDefaults中存放太多的数据,NSUserDefaults是一个plist文件,plist文件会被反序列化一次
  • 避免在启动时打印过多的log,少用NSLog,因为每一次NSLog的调用都会创建一个新的NSCalendar实例
  • 为了防止使用GCD创建过多的线程,解决方法是创建串行队列,或者使用带有最大并发数限制的NSOperationQueue
  • 不要在主线程执行磁盘、网络、Lock或者dispatch_sync、发送消息给其他线程等操作

附:我的博客地址

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS 的 App 启动主要分为以下步骤: 打开 App,系统内核进行初始化跳转到 dyld 执行。这个过程包括这...
    iOS猿_员阅读 6,902评论 2 35
  • 冷启动 定义 从用户点击App图标开始到appDelegate didFinishLaunching方法执行完成为...
    佐_笾阅读 1,376评论 0 7
  • 最近读了几篇文章,关于iOS启动优化,目前看,只有这一篇全面透彻一点。 今日头条iOS客户端启动速度优化 应用启动...
    素还真人阅读 623评论 0 3
  • 前言 最近和公司iOS小组伙伴讨论准备对各自手上的产品做一次优化,确实对比很多产品来看,(支付宝,淘宝,几乎1~2...
    Cingjin阅读 1,880评论 0 7
  • 《和平饭店》开播,豆瓣评分一个劲儿往上飚,我偷偷的在心里乐了开花,因为我欣赏好多年的那个演员,终于悄咪咪的火了起来...
    我是隐形的阅读 965评论 2 8

友情链接更多精彩内容