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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
Digitally17 小时前
如何将大型音频文件从 iPhone 发送到不同的设备
ios·iphone
吴Wu涛涛涛涛涛Tao21 小时前
Flutter 实现「可拖拽评论面板 + 回复输入框 + @高亮」的完整方案
android·flutter·ios
搜狐技术产品小编20231 天前
CAEmitterLayer:iOS 中创建炫酷粒子效果的魔法工具
macos·ios·objective-c·cocoa
M-finder1 天前
Mac菜单栏综合工具FancyTool更新啦
mac·swift
00后程序员张2 天前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
咕噜签名分发冰淇淋2 天前
内测分发是什么?
ios
2501_916007472 天前
Transporter App 使用全流程详解:iOS 应用 ipa 上传工具、 uni-app 应用发布指南
android·ios·小程序·https·uni-app·iphone·webview
白玉cfc2 天前
【OC】单例模式
开发语言·ios·单例模式·objective-c
Digitally2 天前
比较 iPhone:全面比较 iPhone 17 系列
android·ios·iphone