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