6

在基於標籤欄的應用程序中,如果我從一個選項卡中將一個控制器推入導航堆棧中,然後當另一個選項卡處於活動狀態時,我嘗試彈出該控制器,除非在沒有動畫的情況下彈出該控制器,否則它不會被釋放。UIKit不釋放控制器,如果它沒有被動畫刪除?

這工作:

[navigationController popToRootViewControllerAnimated:NO]; 

這並不:

[navigationController popToRootViewControllerAnimated:YES]; 

沒有人有這裏發生了什麼的任何想法? animated參數使用不當嗎?

UPDATE:

蘋果告訴我,這確實是UIKit中的錯誤,他們將其標記爲緊急,並指派某人吧。它可能已在最新版本中得到解決,但我沒有時間檢查。

+1

聽起來像是UIKit中的錯誤。如果您可以通過簡單的項目進行確認,請將其提交給Apple。 – 2010-07-16 12:42:22

+0

我剛剛創建了一個示例項目來確認它,我可以這麼做。當然,這不是每次使用UINavigationController都會發生的事情。如果在一個選項卡內有一個帶有導航控制器的UITabBarController,並且從另一個選項卡彈出導航控制器,則會發生這種情況。我注意到,如果堆棧中有多個視圖控制器,除最後一個之外,它們都會被釋放,直到您選擇返回另一個選項卡(帶有導航控制器的那個)時纔會保留。 – eugeniodepalo 2010-07-16 14:30:19

+1

如果用「last」控制器表示根控制器,那麼這是相關的:「如果堆棧頂部的視圖控制器是根視圖控制器,這個方法什麼都不做......你不能彈出最後一個項目堆棧「。 (來自'popViewControllerAnimated:'的文檔)。你很少必須擔心UIKit何時發佈對象。只要確保你做了你的內存管理的一部分。誰知道,也許框架會保留一個對象來回收它?或者可能不是。關鍵是,你可以依靠它們進行充分測試。 – Felixyz 2010-07-17 00:58:01

回答

0

什麼Dshutsi建議是正確的。如果您想要刪除通知,最好在控制器的viewDidUnload方法中調用。當控制器從堆棧卸載時調用此方法。我只是引用了這個,因爲我們不能評論這個評論作爲答案。

+0

在文檔中寫道,viewDidUnload僅在內存不足的情況下被調用。我想這不是這種情況。儘管這不是我尋找的答案(控制器*應該被釋放),但我會接受它,因爲除了向動畫參數傳遞YES以外,它是唯一的工作解決方案!謝謝。 – eugeniodepalo 2010-07-23 13:35:19

0

如果主要問題是觀察到的通知,爲什麼不在「 - (void)viewWillDisappear:(BOOL)animated」 - 方法中刪除觀察者?

+0

因爲我仍然希望在控制器處於隱藏狀態時收到通知(例如用戶選擇另一個選項卡)。我認爲viewWillDisappear:每次控制器沒有顯示在屏幕上時都會調用,不是嗎? – eugeniodepalo 2010-07-19 15:07:16

+0

您可以嘗試viewDidUnload方法,該方法在視圖從其控制器釋放時應該被調用。 查看以下文檔:http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW36 – Dshutsi 2010-07-20 08:23:08

相關問題