【问题标题】: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 的影响的好文章

【问题讨论】:

    标签: objective-c ios cocoa-touch memory-management uiviewcontroller


    【解决方案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 方法只有在内存警告出现时才会被调用。好的做法是在此方法中释放必要的对象,并使对象为零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-20
      • 2011-07-01
      • 2012-06-25
      • 1970-01-01
      • 2012-04-10
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多