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 中不触发
iOS 6 MPMoviePlayerViewController 和 presentMoviePlayerViewControllerAnimated Rotation