iOS App 启动速度慢的原因与优化
1. iOS App 的启动流程
在 iOS 中,App 的启动流程主要分为两种:
- 冷启动(Cold Launch):App 进程未在内存中,需要完全加载。
- 热启动(Warm Launch):App 进程仍在内存中,系统可以快速恢复。
冷启动通常会消耗更多时间,因此我们主要关注如何优化冷启动时间。
2. iOS App 启动慢的常见原因
2.1 过多的 +load
方法
+load
方法会在应用启动时被调用,而 +initialize
只会在类第一次使用时调用。如果 +load
里做了过多的初始化工作,会影响启动速度。
2.2 AppDelegate
代码过多
如果 application:didFinishLaunchingWithOptions:
方法里包含过多的初始化操作(如网络请求、数据库初始化),会延长启动时间。
2.3 资源加载过大
如果应用在启动时加载了过大的图片、视频、JSON 数据等,可能会导致界面渲染延迟。
2.4 复杂的 UI 渲染
如果 ViewController
在 viewDidLoad
里执行了大量的 UI 计算、AutoLayout
约束,可能会影响启动时间。
2.5 过多的动态库(Dylib)
App 需要在启动时加载所有的动态库(dylib
),如果数量过多,会影响启动速度。
2.6 过度依赖 storyboard
使用大型 Storyboard
可能会导致加载时间过长,影响启动速度。
3. iOS App 启动优化方案
3.1 避免 +load
方法
尽量使用 +initialize
方法来延迟初始化对象。
1
2
3
4
5
+ (void)initialize {
if (self == [MyClass class]) {
// 初始化代码
}
}
3.2 减少 AppDelegate
负担
尽量将初始化操作拆分到 ViewController
或异步执行。
1
2
3
4
5
6
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[self setupDatabase];
});
return YES;
}
3.3 延迟加载资源
对于大图片或 JSON 数据,可以使用 lazy loading
(懒加载)方式。
1
2
3
4
5
6
7
8
9
- (UIImage *)loadLargeImage {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *image = [UIImage imageNamed:@"largeImage"];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
});
return nil;
}
3.4 使用轻量级 ViewController
避免在 viewDidLoad
中做过多 UI 操作,可以将部分 UI 操作延迟到 viewDidAppear
中执行。
1
2
3
4
5
6
7
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_main_queue(), ^{
[self setupUI];
});
}
3.5 减少动态库
合并动态库,减少 dylib
数量。例如,将多个 Framework
合并为一个。
1
2
// 合并 Frameworks,减少动态库加载时间
@import MyFramework;
3.6 采用静态库代替动态库
静态库(Static Library
)比动态库加载更快,可以考虑使用 Static Library
来减少 dylib
依赖。
3.7 拆分 Storyboard
尽量避免使用大型 Storyboard
,可以拆分成多个 Storyboard
或使用 XIB
。
1
2
UIStoryboard *loginStoryboard = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
UIViewController *loginVC = [loginStoryboard instantiateInitialViewController];
3.8 使用 Instrument
工具分析启动时间
可以使用 Xcode 自带的 Instruments -> Time Profiler
来检测启动时间,并找出瓶颈。
- 在 Xcode 中打开
Instruments
。 - 选择
Time Profiler
。 - 启动 App,分析启动过程中的耗时函数。