ios6 中不再调用 viewDidUnload

Posted

技术标签:

【中文标题】ios6 中不再调用 viewDidUnload【英文标题】:viewDidUnload no longer called in ios6 【发布时间】:2012-09-20 08:47:24 【问题描述】:

我刚刚安装了新版本的 Xcode/ios6。 viewDidUnload 现已折旧。

在苹果文档中,

viewDidUnload [...] 在 iOS 6.0 中已弃用。在内存不足的情况下不再清除视图,因此永远不会调用此方法。

但是很多应用都在使用这个回调来释放它们的属性,比如:

- (void)viewDidUnload 
    [super viewDidUnload];

    self.recipientButton = nil;
    self.connectButton = nil;
    self.infoLabel = nil;

这是发布 IBOutlets 的最佳做法。

那么,第一个问题: iOS 6 中这些现有的应用程序会发生什么?他们会泄漏吗?

第二个: 发布 IBOutlet 属性的新推荐方法是什么?在 dealloc 方法中?

【问题讨论】:

【参考方案1】:

对于第一个问题:

您的 ViewController 将收到 didReceiveMemoryWarning 方法回调,您可以在此方法中取消视图和其他组件

如果您还没有,请查看 WWDC 2012 上关于视图控制器进化的视频会议(我相信它们仅适用于注册开发者,但不确定)。

回答你的第二个问题。

[对象释放];在交易中。释放前无需将 nil 分配给对象。

【讨论】:

感谢您的回答。事实上,我对第一个问题更感兴趣。但正如***.com/a/9281416/127493 所说(例如,还有许多其他主题),IBOutlet 属性应该在以前的最佳实践中在 viewDidUnload 中发布。 当然,dealloc 中的[object release]; 只有在您运行 ARC 时才有可能。 WWDC 2012 视频中关于 View Controllers 的逐字逐句:“viewWillUnload 和 viewDidUnload。我们不会再调用它们了。我的意思是,我们经历了一种成本效益方程和分析. 在早期,我们确实需要确保在内存警告时卸载视图。有各种图形和后备存储等也会被卸载。现在我们独立于视图卸载那些, 所以卸载那些对我们来说没什么大不了的,而且有很多错误可以指向 未清除的已卸载视图,最终我们认为不值得自动调用这些视图。所以我们要弃用这些方法。您仍然可以获得相同的行为。您的视图控制器仍将收到“didReceiveMemoryWarning”,如果他们愿意,他们可以取消该视图。它将按预期工作。您可能需要先检查您的视图是否不在窗口中,然后再将其设为 nil。我之所以这么说,是因为有些应用程序实际上使用 viewWillUnload、viewDidUnload 作为摆脱其他资源的一种手段,这些资源也不一定与 视图本身,所以现在代码可能不得不转移到 didReceiveMemoryWarning。"【参考方案2】:

我建议您对 IBOutlets 使用弱属性,例如

@property (weak) IBOutlet UILabel * labelText;

这样你就不需要在 dealloc 中做任何事情。在 iOS 6 中,ViewDidUnload 不会调用,iOS5 或更早的版本只是在发生内存警告时调用。

【讨论】:

【参考方案3】:

第二个:发布 IBOutlet 的新推荐方式是什么 财产 ?在 dealloc 方法中?

什么是“旧”推荐方式?您必须始终释放dealloc 中保留的实例变量;一直都是这样,而且一直都是这样。

只是在viewDidUnload(仅针对低内存调用)您可以将您的属性设置为nil

【讨论】:

以上是关于ios6 中不再调用 viewDidUnload的主要内容,如果未能解决你的问题,请参考以下文章

ios5:停止视图被卸载/停止 viewDidUnload 被调用

从项目的视图控制器中删除所有 -viewDidUnload 的方法

cellForItemAtIndexPath:在 iOS7 中触发,但在 iOS6 中不触发

无法从 iOS6 中的后台线程调用主线程上的代码

iOS 6 MPMoviePlayerViewController 和 presentMoviePlayerViewControllerAnimated Rotation

如何在启用自动布局的情况下更改 iOS6 中的 UIView 大小?