点击下方大众号卡片,重视我,每天共享一个关于 iOS 的新知识
前言
昨天的文章讲了苹果在 iOS 15 出的预热发动,感兴趣的能够去读一下,今日来讲一讲发动速度优化的一些小技巧。
讲讲 iOS 中不为人知的”预热发动”
发动时刻是衡量 App 功能的一个重要指标,苹果主张冷发动时刻不要超越 400ms 为佳。
一般咱们说的发动时刻是指从应用进程发动到榜首帧烘托之间的总时刻,首要咱们先弄清楚发动主要分为几个阶段:
-
Pre Runtime Init: 从 App 进程发动到榜首个 +load() 函数调用
-
Pre Main: 从榜首个 +load() 函数调用到 main() 函数调用
-
UIKit and Application Init: main() 函数调用 didFinishLaunching 办法调用
-
Initial Frame Render: didFinishLaunching 办法调用到榜首帧烘托
具体发动过程能够看苹果文档给的这张图:
优化技巧
1、多使用静态库,少使用动态库
动态加载器 ( dyld ) 加载应用程序的可履行文件,并查看可履行文件中的 Mach 加载指令以查找应用程序所需的结构和动态库。然后,它将每个结构加载到内存中,并解析可履行文件中的动态符号以指向动态库中的恰当地址。
因为这个阶段是在发动时完结的,也就意味着动态库越多,发动时刻越慢。
能够挨个查看一切的动态库,然后认真想一下,真的需求这个库吗?假如能够删掉或许有其他方案能够代替,就把这个动态库删掉吧。假如真的无法删去,也能够考虑能否从动态库转成静态库。
系统的动态库不需求替换。
2、Cocoapods 中的源码库转为静态库
默许情况下,通过 CocoaPods
增加的第三方源码库都为动态库,因为在 Xcode 9 之前,不支持 Swift
静态库编译,CocoaPods
的 Profile
中会默许增加 use_frameworks!
符号,要转成静态库,只需求把 use_frameworks!
改成 use_frameworks! :linkage => :static
。
修正完之后重新 pod install
一下,一切的第三方源码库编程了静态库,假如你使用的库够多,这将为发动速度带来非常大的提高。
3、删去 +load 办法
能够在项目大局查找 + (void)load
,看看都有哪些地方用到了这个办法,因为这个办法是在发动阶段运行的,因而要优化发动速度,有必要要把这儿的代码干掉,考虑把相关代码移动到发动成功之后。
4、耗时操作移后履行
这一步主要是优化 AppDelegate
的 didFinishLaunching
办法到首帧烘托成功之间的逻辑。
首要要仔仔细细整理一下,在这期间都有哪些逻辑,1、2、3、4 全都列出来,然后摆放一下哪一些有必要在这期间完结,哪一些能够推迟到发动成功之后。这些使命能够大致分为三种:
-
有必要在
didFinishLaunching
中完结 -
发动期间不依赖,能够在发动成功后加载
-
能够在使用到的时分再加载(懒加载)
然后就能够在 didFinishLaunching
中完结 1,在首帧加载成功后(能够认为是榜首个控制器的 viewDidAppear)完结 2,剩下的使命在业务使用到的时分再去加载。
5、能放子线程的放子线程
一切在主线程履行的使命都能够考虑是否能放在一个单独的子线程去完结,这样就能够把主线程腾出来高效的去做其他使命。
总结
以上几个过程的优化都是发动耗时的大头,假如你的项目没有做过相关的优化,依照我的过程优化完之后应该能减少不少的发动时刻。
这儿每天共享一个 iOS 的新知识,快来重视我吧
本文同步自微信大众号 “iOS新知”,每天按时共享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!