2011-10-19 75 views
0

我在這裏看到了關於這個主題的一些帖子,但沒有明確的答案。這是我的問題。UINavigationController:彈出時釋放ViewController的內存

我有一個UINavigationController我用作畫廊。在第一個控制器上,我加載了一堆遠程圖像。這增加了我的記憶大小,但不是那麼多。點擊圖片時,它會推到另一個viewController,該圖片只有點擊圖片的圖片。這可能會從這些圖像中加載另一個1MB或更多的數據。

這裏的問題是,用戶可能瀏覽任何數量的這些畫廊。因爲當我彈出viewController時,內存不會被釋放,當用戶繼續瀏覽畫廊時,我開始在我的應用程序中獲取太多的內存使用。

當我彈出我的viewController時,是否有任何方法可以釋放此內存?也許在我的viewDidDisappear:方法中?如果是這樣,我會釋放什麼?我又如何再創造它?我嘗試了這一點,例如發佈我的觀點,但我碰到了崩潰。

對此問題有何洞見?

PhotosGalleryiPad *gallery = [[PhotosGalleryiPad alloc] init]; 
gallery.items = self.items; 
gallery.asset = self.currentAsset; 
[self.navigationController pushViewController:gallery animated:YES]; 
[gallery release]; 
+0

老實說...這聽起來像內存真的應該在從堆棧中彈出時加載的視圖的「dealloc」卸載。你確定你正在釋放dealloc中的所有照片數據嗎?除非您以某種方式允許用戶無限制地瀏覽大量視圖,而無需單擊「後退」按鈕...視圖導航器中的視圖通常應單擊標題中的後退按鈕來釋放。如果是這種情況,那麼你可能想看看不同的導航範例。 – Delete

+0

不,dealloc正在被調用,我的屬性正在釋放。他們只需點擊,推動控制器,然後點擊正常的「返回」按鈕彈出回到根目錄。 –

回答

0

如果你是「啪」的觀點在這樣的前景:

infoScreen = [[[infoScreen alloc] initWithNibName:@"InfoScreen" bundle:nil] autorelease]; 
infoScreen.view.center = CGPointMake(self.view.bounds.size.width/2, self.view.bounds.size.height/2); 
[self.view sendSubviewToBack:self.view]; 

然後你會做[infoScreen release]; 釋放/釋放內存中的視圖。
記住你的任何事情allocretain(還有其他的情況,但我忘記他們)你需要release

+0

我瞭解內存管理規則。我不確定我在這裏遵循你的建議。 –

+0

也許我誤解了你的問題,我以爲你需要幫助釋放內存從視圖控制器不再被使用。 –

+0

我這樣做,似乎它將視圖控制器從堆棧彈回時保留在內存中。 –

0

您通常會在彈出堆棧的視圖控制器的dealloc方法中釋放任何內存。

但是,如果您正在討論圖像,並且您將它們加載到[UIImage imageNamed:]那麼UIKit可能會緩存它們。嘗試在模擬器中僞造內存警告(從硬件菜單中),看看是否卸載這些緩存的圖像。

您還可以在樂器中進行堆積分析。在加載視圖控制器之前標記堆,在關閉視圖控制器之後再次標記它,並查看哪些對象存在。

0

你究竟在哪裏保留這些圖庫圖像?

讓我猜測gallery.items是一個可變集合(可能是一個數組),它可以保存圖像。隨着用戶訪問新的畫廊,更多的圖像被添加到這個陣列。從視圖控制器視圖控制器,你傳遞一個指針數組:

gallery.items = self.items; 

所以,當你彈出視圖控制器,你仍然留下了相同的,放大的,陣列。那麼,問題是如何在彈出視圖控制器時剔除新添加的圖像的數組。

與傳遞指針不同,您可以製作一個shallow copy of the collection。如果它是一個可變的數組,你可以做如下:

gallery.items = [self.items mutableCopyWithZone:nil]; 

然後,當一個視圖控制器被彈出,其items陣列被釋放。彈出的視圖控制器添加的對象被釋放,但舊對象仍保留在前一視圖控制器的items陣列中。

(我只是採取了猜測。如果我錯了,如果你解釋你在哪裏保留這些圖像將是有益的。)

+0

不,它不是一個圖像數組。它是一組圖像網址,只是NSStrings。我需要做一些研究,我有一種感覺,這可能是由我正在使用的一些第三方代碼引起的。 –

+0

聽起來不像它是保留圖像的視圖控制器。如果你在dealloc中正確釋放屬性,我能想到視圖控制器會保留任何東西的唯一方法就是通過一個不被複制的集合。也許如果你看看圖像的創建或下載位置,你會發現他們所持有的東西。 –

+0

謝謝,會做。 –