iOS 启动优化

本文详细探讨了iOS应用的启动过程,包括冷启动和热启动,分析了main函数前后两个阶段的优化点。主要关注dylib加载、Objc类与+load方法的优化,以及main()函数阶段的日志、初始化和首页渲染的异步加载策略,旨在提升应用启动速度和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 冷启动

从点击图标启动程序到didFinishLaunchingWithOptions首页viewDidLoad加载完成,是一次完整的启动过程。

  • 热启动

从后台从新进入前台

按照main调用之前和之后可以分为两个个阶段:

  • T1:pre-main阶段,即main()函数之前,即操作系统加载App可执行文件到内存,然后执行一系列的加载&链接等工作,最后执行至App的main()函数;
  • T2:main()函数之后,即从main()开始,到appDelegate的didFinishLaunchingWithOptions方法执行完毕前这段时间,主要是构建第一个界面,并完成渲染。

分析两个阶段都做了什么操作才能有针对的优化

  • pre-main

苹果提供了内建的测量方法,在 Xcode 中 Edit scheme -> Run -> Auguments 将环境变量 DYLD_PRINT_STATISTICS 设为 1。
也可以用instrumentTime profile
另一种方法:
配置Build Options—>Debug Information Format的debug模式下选择DRAF with dSYM File
Edit Scheme—>profile—>Build Configuration选择debug
command + i启动instrument,选择Time profile查看运行时间

Total pre-main time: 521.18 milliseconds (100.0%)
         dylib loading time:  28.46 milliseconds (5.4%)
        rebase/binding time: 186.65 milliseconds (35.8%)
            ObjC setup time: 241.89 milliseconds (46.4%)
           initializer time:  64.16 milliseconds (12.3%)
           slowest intializers :
             libSystem.B.dylib :   9.33 milliseconds (1.7%)
   libBacktraceRecording.dylib :  11.79 milliseconds (2.2%)
    libMainThreadChecker.dylib :  26.96 milliseconds (5.1%)
  libViewDebuggerSupport.dylib :  13.69 milliseconds (2.6%)

程序启动总共用了521ms,以及各个阶段所用的时间、slowest intializers(最慢)的几个库所用的时间。

dylib loading(加载动态链接库)

  • 优化的点
    减少非系统库的依赖
    合并非系统库

Rebase/Bind image 指针重定位

  • 优化的点有
    减少Objc类数量, 减少selector数量
    减少C++虚函数数量

Objc setup

  • 优化的点基本没有

initializer

  • 优化的点有
    减少过多的+load方法
    检查 +load 方法,尽量把事情推迟到 +initiailize 方法里执行。
    在这里我们修改了部分原本代码中直接在 +load 函数初始化逻辑改为在 +initialize 中加载,也就是到使用时才加载。
  • main()函数阶段

didFinishLaunchingWithOptions里面通常都是

  • 日志、统计等必须在 APP 一启动就最先配置的事件
  • 项目配置、环境配置、用户信息的初始化 、推送、IM等事件
  • 根容器、控制器初始化
  • 优化的点
    多线程异步加载(sdk初始化异步操作)
    优化业务逻辑
    首页渲染(放到viewDidLoad之后操作)
    纯代码代替xib/storyboard来进行UI框架的搭建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值