2012-04-04 105 views
0

我有一個自定義的UIViewController子類,它自己處理所有的視圖初始化(它不使用nib)。還有另一個從nib加載的UIViewController子類。兩者都包含在UITabBarController中。 當出現內存警告時,第一個控制器會收到通知,但viewDidUnload不會被調用。第二個控制器也接收通知,它的viewDidUnload確實被調用。 我檢查了didReceiveMemoryWarning,self.isViewLoaded爲TRUE,self.view.superview爲null。 兩個控制器(它們的選項卡)在通知出現時都不可見。自定義UIViewController viewDidUnload永遠不會被調用

是否有什麼特別的自定義視圖控制器應該做的,以卸載內存警告的結果?

+0

AFAIK,它完全取決於os。 – borrrden 2012-04-04 14:13:02

回答

1

如果您繼承UIViewContoller並且您沒有從NIB初始化它,則需要繼承-loadView方法的子類。否則,iOS假定視圖不能被卸載/重載。

這將足以只需添加以下到您的實現:

- (void)loadView { 
    [super loadView]; 
} 

我會盡量找到一個文件的報價。

The documentation is unfortunately not very clear on this matter.

+0

謝謝,非常有幫助。 – note173 2012-04-04 15:03:35

+0

不應在自定義loadView方法中調用[super loadView]。代碼如下:self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen] .applicationFrame] autorelease]; //在上面引用的文檔中,這是由蘋果公司指出的 – 2012-06-13 11:43:48

+0

這不是一種自定義加載方法,而是簡單的實現,讓框架知道這個視圖可以被重新創建。 – FelixLam 2012-06-18 16:30:11

0

我會查看關於View Controller生命週期的文檔。具體來說,請查看收到內存警告時會發生什麼的部分。如果您的自定義視圖控制器的視圖是屏幕上的視圖,則操作系統不會嘗試釋放此視圖。當您收到內存警告時,屏幕上是否顯示此視圖?在模擬器中,導航至裝入筆尖的視圖並模擬內存警告,然後查看您的自定義視圖是否已釋放。另外,看看是否正在調用viewWillUnload。並確保在這些方法中,你超越了你稱之爲超級的方法。

+0

他確實說過「兩個控制器(它們的選項卡)在通知出現時都不可見」。這是什麼使這個問題感興趣.... – lnafziger 2012-04-04 14:21:50

+0

那麼,不是最清晰的問題。我可以在選項卡欄控制器中放置一個視圖控制器並隱藏選項卡欄。對我而言,這將與「隱藏標籤」一樣。我的標籤是隱藏的,當然,但我的視圖仍然在屏幕上。標籤欄控制器只是控制器的一個控制器。 – jmstone617 2012-04-04 14:23:29

相關問題