20

我想知道viewDidUnloaddealloc是否是總是在UIViewController拆卸過程中連續調用。是否可以在我的視圖控制器上調用dealloc,而不是先調用viewDidUnloadviewDidUnload和dealloc在拆除UIViewController時總是被調用嗎?

在這兩種情況下,如果我在兩種方法中安全地釋放屬性並保留引用,那麼調用這兩種方法都不會成爲問題 - 但我想知道是否有人確實知道或可以闡明拆卸過程。

2012更新:它的方便需要注意的是,如同iOS 6的viewDidUnload已被棄用,如果需要的話在didReceiveMemoryWarning應具有手動視圖拆卸所取代。

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

回答

35

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

0

相當深思,viewDidiUnload方法只有在出現內存警告時纔會調用。好的做法是在該方法中釋放必需的對象,並使對象爲零。