viewDidUnload和dealloc在拆除UIViewController时总是被调用吗?

问题描述:

我想知道viewDidUnloaddealloc是否是总是在UIViewController拆卸过程中连续调用。是否可以在我的视图控制器上调用dealloc,而不是先调用viewDidUnloadviewDidUnload和dealloc在拆除UIViewController时总是被调用吗?

在这两种情况下,如果我在两种方法中安全地释放属性并保留引用,那么调用这两种方法都不会成为问题 - 但我想知道是否有人确实知道或可以阐明拆卸过程。

2012更新:它的方便需要注意的是,如同iOS 6的viewDidUnload已被弃用,如果需要的话在didReceiveMemoryWarning应具有手动视图拆卸所取代。

在新的UIView/UIViewContoller和新的行为的一个很好的文章,它是在joe conway blog

viewDidUnload效果不会这样调用dealloc方法每次。 viewDidUnload仅在您的应用收到低内存警告时才会调用!

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

+1

我想你的意思是'viewDidUnload'当你在你的答案中说'viewDidLoad'。当内存不足时,不会调用viewDidLoad,但当视图出现在屏幕上时(在viewWillAppear之前)。当存在低内存警告时调用'viewDidUnload'。 – 2010-07-10 17:26:56

+0

这应该是正确的答案。这让我今天陷入麻烦。 – asandroq 2010-08-24 20:18:40

+0

好像可以在viewDidUnload里面做self.whatever = nil,然后在dealloc里调用[_whatever release]。这样,如果viewDidUnload被首先调用,那么该项目不会被dealloc超额释放,因为它将被删除,并且释放消息在发送到nil时会消失。任何人都可以确认吗? – jpswain 2011-11-30 04:57:55

相当深思,viewDidiUnload方法只有在出现内存警告时才会调用。好的做法是在该方法中释放必需的对象,并使对象为零。