拆除 UIViewController 时是不是总是调用 viewDidUnload 和 dealloc?

Posted

技术标签:

【中文标题】拆除 UIViewController 时是不是总是调用 viewDidUnload 和 dealloc?【英文标题】:Are viewDidUnload and dealloc always called when tearing down a UIViewController?拆除 UIViewController 时是否总是调用 viewDidUnload 和 dealloc? 【发布时间】:2010-12-18 14:13:15 【问题描述】:

我想知道 viewDidUnloaddealloc 在 UIViewController 拆卸过程中是否总是被连续调用。是否可以在我的视图控制器上调用 dealloc 而无需先调用 viewDidUnload

在任何一种情况下,如果我在这两种方法中安全地释放属性和保留的引用,那么调用这两种方法都不是问题——但我想知道是否有人确定或可以阐明拆卸过程。

2012 年更新: 请注意,好像 ios 6 viewDidUnload 已被弃用,应该在 didReceiveMemoryWarning 中替换为手动视图拆解如果需要

一篇关于新 UIView/UIViewContoller 和新行为及其对joe conway blog 的影响的好文章

【问题讨论】:

【参考方案1】:

viewDidUnload 不会dealloc 方法那样每次都被调用。 viewDidUnload 仅在您的应用收到内存不足警告时调用!

试想一下,如果你同时在 viewDidUnloaddealloc 方法中释放你的对象。如果每次都调用两者,那么您正在释放已经释放的对象,这将导致应用程序崩溃,不是吗? viewDidUnload 是苹果提供的一个地方,用于在收到内存不足警告时清理东西,因为你知道在 iPhone 中我们有内存限制。

【讨论】:

当您在回答中说 viewDidLoad 时,我认为您的意思是 viewDidUnloadviewDidLoad 不会在内存不足时调用,而是当视图将出现在屏幕上时(viewWillAppear 之前)。 viewDidUnload 在内存不足警告时被调用。 这应该是正确的答案。这让我今天遇到了麻烦。 似乎可以在 viewDidUnload 中执行 self.whatever = nil ,然后在 dealloc 中调用 [_whatever release] 。这样,如果 viewDidUnload 被首先调用,那么该项目将不会被 dealloc 过度释放,因为它将被 nil'ed 并且释放消息将在发送到 nil 时消失。谁能证实这一点? 是的。一旦 self.whatever 被设置为 nil,调用 [whatever release] 就变成了无操作:你将 release 消息发送给一个 nil 对象,而不是任何对象(因为它不再指向它曾经持有的对象) .【参考方案2】:

很贴心的是,viewDidiUnload 方法只有在内存警告出现时才会被调用。好的做法是在此方法中释放必要的对象,并使对象为零。

【讨论】:

以上是关于拆除 UIViewController 时是不是总是调用 viewDidUnload 和 dealloc?的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController:UITableView 和 UIToolbar 之间的空白

当 UIViewController 回到顶部时,iOS 中是不是有委托函数来获得通知?

当我加载的另一个 AppDomain 引发未处理的异常时,我可以隔离我当前的 AppDomain 以防被拆除吗?

插座应该保持打开还是拆除[重复]

如何正确拆除多人连接会话?

XIB 的所有者是不是必须/应该是 UIViewController