在新的 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.viewnil 当收到内存不足警告时。这样做是没有用的,而且可能有害。

iOS 6 将自动释放当前未显示的视图的位图,请参阅 http://thejoeconwayblog.wordpress.com/2012/10/04/view-controller-lifecycle-in-ios-6/ 了解详情。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top