viewDidUnload和dealloc在拆除UIViewController时总是被调用吗?
问题描述:
我想知道viewDidUnload
和dealloc
是否是总是在UIViewController拆卸过程中连续调用。是否可以在我的视图控制器上调用dealloc
,而不是先调用viewDidUnload
?viewDidUnload和dealloc在拆除UIViewController时总是被调用吗?
在这两种情况下,如果我在两种方法中安全地释放属性并保留引用,那么调用这两种方法都不会成为问题 - 但我想知道是否有人确实知道或可以阐明拆卸过程。
2012更新:它的方便需要注意的是,如同iOS 6的viewDidUnload
已被弃用,如果需要的话在didReceiveMemoryWarning
应具有手动视图拆卸所取代。
在新的UIView/UIViewContoller和新的行为的一个很好的文章,它是在joe conway blog
答
viewDidUnload
效果不会这样调用dealloc
方法每次。 viewDidUnload
仅在您的应用收到低内存警告时才会调用!
试想一下,如果你在viewDidUnload
和dealloc
方法中释放你的对象。如果每次都被调用,那么你正释放已经释放的对象,这会导致应用程序崩溃,不是吗? viewDidUnload
是Apple提供的用于在接收到低内存警告时清理内容的地方,因为您知道在iPhone中我们有内存限制。
答
相当深思,viewDidiUnload方法只有在出现内存警告时才会调用。好的做法是在该方法中释放必需的对象,并使对象为零。
我想你的意思是'viewDidUnload'当你在你的答案中说'viewDidLoad'。当内存不足时,不会调用viewDidLoad,但当视图出现在屏幕上时(在viewWillAppear之前)。当存在低内存警告时调用'viewDidUnload'。 – 2010-07-10 17:26:56
这应该是正确的答案。这让我今天陷入麻烦。 – asandroq 2010-08-24 20:18:40
好像可以在viewDidUnload里面做self.whatever = nil,然后在dealloc里调用[_whatever release]。这样,如果viewDidUnload被首先调用,那么该项目不会被dealloc超额释放,因为它将被删除,并且释放消息在发送到nil时会消失。任何人都可以确认吗? – jpswain 2011-11-30 04:57:55