- 生命周期影响:
- 当系统发出内存警告时,视图控制器的相关生命周期方法会被调用,以提示开发者释放不必要的资源,避免应用因内存不足而崩溃。
- 相关生命周期方法及响应:
didReceiveMemoryWarning
方法:
- 此方法在视图控制器接收到内存警告时被调用。
- 在iOS 6.0及之后,若视图控制器的视图当前不在窗口层级上(即视图没有显示在屏幕上),系统会自动释放视图控制器的视图(
view
属性会被设置为nil
),并调用didReceiveMemoryWarning
方法。
- 开发者在这个方法中应释放任何可以在需要时重新创建的资源,比如缓存数据、图片等。
- 正确处理以避免问题:
- 释放缓存数据:如果视图控制器中有数据缓存,例如图片缓存等,在
didReceiveMemoryWarning
方法中可以清空这些缓存。例如:
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// 假设存在一个NSMutableDictionary类型的图片缓存
if (self.imageCache) {
[self.imageCache removeAllObjects];
self.imageCache = nil;
}
}
- 取消未完成的任务:如果视图控制器有正在进行的异步任务,如网络请求、文件下载等,可以在
didReceiveMemoryWarning
方法中取消这些任务,以释放相关资源。例如使用NSURLSession
进行网络请求时:
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
if (self.downloadTask) {
[self.downloadTask cancel];
self.downloadTask = nil;
}
}
- 检查并释放视图相关资源:虽然iOS 6.0及之后系统可能会自动释放不在窗口层级上的视图,但开发者仍应检查视图及其子视图中是否有额外的资源需要释放,比如自定义视图可能持有一些大的位图等资源,需要手动释放。
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
if (self.customView.largeBitmap) {
self.customView.largeBitmap = nil;
}
}