2011-07-10 63 views
0

如果當前可見的視圖控制器(superview!= nil)被卸載時,我完全混淆瞭如何處理內存警告。該設置是一個tabbarcontroller作爲rootViewController,一個帶有視圖控制器的導航控制器,它說視圖控制器A.我將視圖控制器B推到視圖控制器A的導航堆棧上。我模擬內存警告。didreceivememorywarning在可見視圖控制器上導致viewdidunload

1)視圖控制器A獲取內存警告,其視圖被卸載,一切正常。

2)視圖控制器B(當前可見)獲取內存警告。我打印出它的超級視圖。我甚至證實,導航控制器的

(gdb) po [[self view] superview] 
<UIViewControllerWrapperView: 0x12310c80; frame = (0 64; 1024 655); autoresize = W+H;  layer = <CALayer: 0x12310cb0>>> 
(gdb) po [self navigationController] 
<UINavigationController: 0x714efd0> 
(gdb) po [[[self navigationController] view] superview] 
<UIViewControllerWrapperView: 0x740b0c0; frame = (0 0; 1024 719); autoresize = W+H; layer = <CALayer: 0x740b140>> 

/*** can you see how desperate i am? :) ***/ 
(gdb) po [[[[[self view] window] rootViewController] view] superview] 
<UIWindow: 0x7162910; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7163660>> 

3)我知道的下一件事,可見視圖控制器的觀點已被卸載(在視圖控制器的viewDidUnload方法斷點被擊中)

因爲即時通訊目前正在尋找在這個視圖控制器,它的viewDidLoad永遠不會再被調用,除非我回到它。這似乎與相當多的帖子說,當superview!= nil視圖沒有被卸載!,我已經調查了整個堆棧!

爲了澄清,我不問在viewDidUnload做什麼,或發佈什麼樣的數據等等我試圖瞭解爲什麼框架發送一個didReceiveMemoryWarning到一個視圖控制器,顯然仍然是部分的視圖hiearchy。

想法?

回答

-1

要回答你這裏的問題是來自蘋果的模板

- (void)didReceiveMemoryWarning 
{ 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

這是這樣你就可以釋放內存,只是因爲你的看法是可見它使用分配給它的所有資源,並不意味着該方法存根。

+0

這裏是問題:從上面打印的gdb輸出中,在超級視圖不是零的時候,在我看來視圖被釋放事件。有沒有人遇到類似的情況? – Ying

+0

這不是一個答案。 –

-1

視圖控制器收到內存警告,因爲它們可能會做潛在的內存密集型的事情,因此需要釋放內存。假設您有一個用戶可能與之交互的數據緩存,但是如果需要的話可以重新加載。您可能希望將其轉儲到didReceiveMemoryWarning中,因爲根據需求重新加載會比由於缺少mem而崩潰更好。但是,您不應該在didReceiveMemoryWarning中發佈視圖或用戶當前正在進行交互的任何視圖,否則您會看到您所看到的行爲。

另外,正如Paul.s的答案指出的那樣,視圖控制器在實際上當前不被查看時會接收到內存警告,因此它可以安全地釋放它們的視圖。不過,我會把它留給超級的實現(如圖所示),因爲它已經在那裏處理了。

當您收到內存警告時是否釋放視圖(或其中的一部分)?如果是這樣,您應該將該代碼移至viewDidUnload。

+0

我無法控制視圖是否解封。如果它認爲有必要,框架卸載視圖,然後調用viewDidUnload,是不是正確的?如果主視圖正在被卸載,我是否會釋放子視圖的視圖並不重要,因爲它的父視圖已經消失了!顯然,釋放它們以保存記憶是一種很好的形式,但這不是我的問題。 – Ying

+0

我應該說,我不控制'主視圖'是否被卸載(意味着UIViewController的視圖)。是的,我確實控制我是否發佈其他觀點,但這些都是主視圖的子視圖。 – Ying

+0

這不是一個答案。 –

相關問題