7

在新的 iOS 6 中,viewDidUnload已弃用,我们被指示使用它didReceiveMemoryWarning来管理 UIViewController 实例和子类中的对象。将 nils 分配给内部的 UIView 种类是否同样有效,didReceiveMemoryWarning就像它在内部完成的方式一样viewDidUnload

我问这个是因为这两种方法似乎工作方式不同。似乎didReceiveMemoryWarning不能保证viewDidLoad再次调用以重新实例化任何必要的 UIView。

我怀疑使用 iOS 6,无需手动释放 UIView 即可完成内存管理。请帮助我了解我在理解 UIViewController 的生命周期时遗漏了什么。

4

3 回答 3

13

我现在的首选方法如下:

- (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 之前被调用。

于 2012-10-03T13:36:38.147 回答
4

在 iOS 参考中viewDidUnload:,它声明这对于 iOS 6 已弃用,因为

在内存不足的情况下不再清除视图,因此永远不会调用此方法

它没有说明将此代码放在didReceiveMemoryWarning:. 由于在内存不足的情况下不再清除视图,因此您不必担心在任何一种方法中清理视图。

于 2012-10-03T13:22:26.043 回答
0

Eiko 的回答是不正确的,我们不应该self.viewnil收到内存不足警告时设置。这样做是没有用的,而且可能有害。

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

于 2013-07-04T10:08:22.963 回答