MST

星途 面试题库

面试题:Objective-C视图控制器在内存警告情况下的生命周期管理及处理机制

当系统发出内存警告时,Objective-C的视图控制器的生命周期会受到什么影响?请描述相关生命周期方法如何响应内存警告,开发者应该在这些方法中如何正确处理以避免内存泄漏或应用崩溃等问题,例如如何释放不必要的资源等。
18.6万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 生命周期影响
    • 当系统发出内存警告时,视图控制器的相关生命周期方法会被调用,以提示开发者释放不必要的资源,避免应用因内存不足而崩溃。
  2. 相关生命周期方法及响应
    • didReceiveMemoryWarning方法:
      • 此方法在视图控制器接收到内存警告时被调用。
      • 在iOS 6.0及之后,若视图控制器的视图当前不在窗口层级上(即视图没有显示在屏幕上),系统会自动释放视图控制器的视图(view属性会被设置为nil),并调用didReceiveMemoryWarning方法。
      • 开发者在这个方法中应释放任何可以在需要时重新创建的资源,比如缓存数据、图片等。
  3. 正确处理以避免问题
    • 释放缓存数据:如果视图控制器中有数据缓存,例如图片缓存等,在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;
    }
}