iOS 一些能明显提升启动速度的技巧

点击下方公众号卡片,关注我,每天分享一个关于 iOS 的新知识

前言

昨天的文章讲了苹果在 iOS 15 出的预热启动,感兴趣的可以去读一下,今天来讲一讲启动速度优化的一些小技巧。

讲讲 iOS 中不为人知的"预热启动"

启动时间是衡量 App 性能的一个重要指标,苹果建议冷启动时间不要超过 400ms 为佳。

一般我们说的启动时间是指从应用进程启动到第一帧渲染之间的总时间,首先我们先弄清楚启动主要分为几个阶段:

  1. Pre Runtime Init: 从 App 进程启动到第一个 +load() 函数调用

  2. Pre Main: 从第一个 +load() 函数调用到 main() 函数调用

  3. UIKit and Application Init: main() 函数调用 didFinishLaunching 方法调用

  4. Initial Frame Render: didFinishLaunching 方法调用到第一帧渲染

详细启动过程可以看苹果文档给的这张图:

优化技巧

1、多使用静态库,少使用动态库

动态加载器 ( dyld ) 加载应用程序的可执行文件,并检查可执行文件中的 Mach 加载命令以查找应用程序所需的框架和动态库。然后,它将每个框架加载到内存中,并解析可执行文件中的动态符号以指向动态库中的适当地址。

因为这个阶段是在启动时完成的,也就意味着动态库越多,启动时间越慢。

可以挨个检查所有的动态库,然后认真想一下,真的需要这个库吗?如果可以删掉或者有别的方案可以代替,就把这个动态库删掉吧 。如果真的无法删除,也可以考虑能否从动态库转成静态库

系统的动态库不需要替换。

2、Cocoapods 中的源码库转为静态库

默认情况下,通过 CocoaPods 添加的第三方源码库都为动态库,因为在 Xcode 9 之前,不支持 Swift 静态库编译,CocoaPodsProfile 中会默认添加 use_frameworks! 标记,要转成静态库,只需要把 use_frameworks! 改成 use_frameworks! :linkage => :static

修改完之后重新 pod install 一下,所有的第三方源码库编程了静态库,如果你使用的库够多,这将为启动速度带来非常大的提升

3、删除 +load 方法

可以在项目全局搜索 + (void)load,看看都有哪些地方用到了这个方法,因为这个方法是在启动阶段运行的,因此要优化启动速度,必须要把这里的代码干掉,考虑把相关代码移动到启动成功之后。

4、耗时操作移后执行

这一步主要是优化 AppDelegatedidFinishLaunching 方法到首帧渲染成功之间的逻辑。

首先要认认真真整理一下,在这期间都有哪些逻辑,1、2、3、4 全都列出来,然后排列一下哪一些必须在这期间完成,哪一些可以推迟到启动成功之后。这些任务可以大致分为三种:

  1. 必须在 didFinishLaunching 中完成

  2. 启动期间不依赖,可以在启动成功后加载

  3. 可以在使用到的时候再加载(懒加载)

然后就可以在 didFinishLaunching 中完成 1,在首帧加载成功后(可以认为是第一个控制器的 viewDidAppear)完成 2,剩下的任务在业务使用到的时候再去加载。

5、能放子线程的放子线程

所有在主线程执行的任务都可以考虑是否能放在一个单独的子线程去完成,这样就可以把主线程腾出来高效的去做其他任务。

总结

以上几个步骤的优化都是启动耗时的大头,如果你的项目没有做过相关的优化,按照我的步骤优化完之后应该能减少不少的启动时间。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
sakiko_10 小时前
UIKit学习笔记5-使用UITableView制作聊天页面
笔记·学习·swift·uikit
朗清风13 小时前
“\“在字符串表示正则语义中的作用
swift
懋学的前端攻城狮19 小时前
iOS 列表性能优化实战:从 45fps 到 60fps 的蜕变
ios·性能优化·ui kit
斯班奇的好朋友阿法法19 小时前
鸿蒙 vs iOS vs 微信小程序:开发平台全面对比
ios·微信小程序·harmonyos
@大迁世界1 天前
14个你现在必须关闭的 iOS 26 设置,不然手机很快被它榨干
macos·ios·智能手机·objective-c·cocoa
四眼蒙面侠2 天前
深入 SwiftWork(第 0 篇):用 SwiftUI 构建一个 Agent 可视化工作台
swift·openagentsdk
YJlio2 天前
10.2.8 以其他账户运行服务(Running services in alternate accounts):为什么“把服务切到某个用户账号下运行”,本质上是在改变服务的整个安全上下文?
python·安全·ios·机器人·django·iphone·7-zip
pop_xiaoli2 天前
【iOS】KVC与KVO
笔记·macos·ios·objective-c·cocoa
90后的晨仔2 天前
《swiftUI进阶 第10章:现代状态管理(iOS 17+)》
ios
sakiko_2 天前
UIKit学习笔记4-使用UITableView制作滚动视图
笔记·学习·ios·swift·uikit