MST

星途 面试题库

面试题:Objective-C 中如何在内存警告时处理视图控制器的资源释放

假设你正在开发一个 iOS 应用,包含多个视图控制器,在收到内存警告时,你会采取哪些措施来释放视图控制器所占用的资源,以避免应用因内存不足而崩溃,请详细描述实现步骤及相关代码。
14.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 在视图控制器中重写didReceiveMemoryWarning方法
    • 当视图控制器接收到内存警告时,系统会调用此方法。
    • 首先调用父类的didReceiveMemoryWarning方法,以确保系统默认的内存清理工作得以执行。
    • 示例代码如下:
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // 在此添加自定义的内存清理代码
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // 在此添加自定义的内存清理代码
    }
    
  2. 释放非必要的视图和数据
    • 释放视图:如果视图控制器当前显示的视图暂时不需要,可以将其从内存中释放。例如,如果有一个图片视图,且图片较大,在内存紧张时可以释放图片。
      • Objective - C代码:
      if (self.imageView.image) {
          self.imageView.image = nil;
      }
      
      • Swift代码:
      if let _ = self.imageView.image {
          self.imageView.image = nil
      }
      
    • 释放数据:如果视图控制器持有一些占用大量内存的数据结构,如大数组、大字典等,且当前不需要,可以将其释放。
      • Objective - C代码:
      if (self.largeArray) {
          self.largeArray = nil;
      }
      
      • Swift代码:
      if let _ = self.largeArray {
          self.largeArray = nil
      }
      
  3. 取消网络请求
    • 如果视图控制器正在进行网络请求,在内存警告时应取消这些请求,以释放相关资源。
    • 以AFNetworking为例:
      • Objective - C代码:
      if (self.dataTask) {
          [self.dataTask cancel];
          self.dataTask = nil;
      }
      
      • Swift代码:
      if let task = self.dataTask {
          task.cancel()
          self.dataTask = nil
      }
      
  4. 清理通知观察者
    • 如果视图控制器注册了一些通知,在内存警告时应移除这些观察者,防止内存泄漏。
    • 示例代码:
      • Objective - C代码:
      [[NSNotificationCenter defaultCenter] removeObserver:self name:@"SomeNotification" object:nil];
      
      • Swift代码:
      NotificationCenter.default.removeObserver(self, name: NSNotification.Name("SomeNotification"), object: nil)
      
  5. 释放缓存
    • 如果视图控制器使用了缓存,如图片缓存等,在内存警告时可以清理缓存。
    • 以SDWebImage的缓存为例:
      • Objective - C代码:
      [[SDImageCache sharedImageCache] clearMemory];
      
      • Swift代码:
      SDImageCache.shared.clearMemory()