viewDidUnload 中有效的内容应该移至 didReceiveMemoryWarning 吗?
-
13-12-2019 - |
题
在新的 iOS 6 中, viewDidUnload
已弃用,我们已被指示使用 didReceiveMemoryWarning
相反,管理 UIViewController 实例和子类中的对象。将 nils 分配给内部的 UIView 类型是否同样有效 didReceiveMemoryWarning
就像里面的做法一样 viewDidUnload
?
我问这个问题是因为这两种方法的工作原理似乎不同。这好像是 didReceiveMemoryWarning
不保证 viewDidLoad
再次调用以重新实例化任何必要的 UIView。
我怀疑在 iOS 6 中,内存管理不需要手动释放 UIView 就可以完成。请帮助我了解我在理解 UIViewController 生命周期时错过了什么。
解决方案
我现在首选的方法如下:
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
if (self.isViewLoaded && !self.view.window) {
self.view = nil;
}
// Do additional cleanup if necessary
}
请注意,测试 self.isViewLoaded
这是必不可少的,否则访问视图会导致其加载 - 即使 WWDC 视频也往往会错过这一点。
如果您对子视图的其他引用是弱引用,则不必在这里将它们设为 nil,否则您也想将它们设置为 nil。
你应该摆脱 viewDidUnload
完全,并且那里的每个代码都应该移动到适当的位置。无论如何,在 iOS 6 之前并不能保证它会被调用。
其他提示
在 iOS 参考中 viewDidUnload:
, ,它指出这在 iOS 6 中已被弃用,因为
在低内存条件下不再清除视图,因此此方法从未称为
它没有说明将此代码放入 didReceiveMemoryWarning:
. 。由于在内存不足的情况下不再清除视图,因此您永远不必担心用任何一种方法清理视图。
Eiko 的答案不正确,我们不应该设置 self.view
到 nil
当收到内存不足警告时。这样做是没有用的,而且可能有害。
iOS 6 将自动释放当前未显示的视图的位图,请参阅 http://thejoeconwayblog.wordpress.com/2012/10/04/view-controller-lifecycle-in-ios-6/ 了解详情。