拆除 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 【问题描述】:我想知道 viewDidUnload
和 dealloc
在 UIViewController 拆卸过程中是否总是被连续调用。是否可以在我的视图控制器上调用 dealloc
而无需先调用 viewDidUnload
?
在任何一种情况下,如果我在这两种方法中安全地释放属性和保留的引用,那么调用这两种方法都不是问题——但我想知道是否有人确定或可以阐明拆卸过程。
2012 年更新: 请注意,好像 ios 6 viewDidUnload
已被弃用,应该在 didReceiveMemoryWarning
中替换为手动视图拆解如果需要。
一篇关于新 UIView/UIViewContoller 和新行为及其对joe conway blog 的影响的好文章
【问题讨论】:
【参考方案1】:viewDidUnload
不会像dealloc
方法那样每次都被调用。 viewDidUnload
仅在您的应用收到内存不足警告时调用!
试想一下,如果你同时在 viewDidUnload
和 dealloc
方法中释放你的对象。如果每次都调用两者,那么您正在释放已经释放的对象,这将导致应用程序崩溃,不是吗? viewDidUnload
是苹果提供的一个地方,用于在收到内存不足警告时清理东西,因为你知道在 iPhone 中我们有内存限制。
【讨论】:
当您在回答中说viewDidLoad
时,我认为您的意思是 viewDidUnload
。 viewDidLoad
不会在内存不足时调用,而是当视图将出现在屏幕上时(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 中是不是有委托函数来获得通知?