2012-12-23 27 views
1

得到了怪異的事情發生了......我有一個非常複雜的UIViewController子類,其中我加載通過NIB文件。 我簡單地做下面推的觀點:的UIViewController不釋放內存在第一時間

SecondViewController2 *secV = [[SecondViewController2 alloc] initWithNibName:@"SecondViewController2" bundle:nil]; 
     self.secondViewController2 = secV; 
[secV release]; 
[self.navigationController pushViewController:secondViewController2 animated:YES]; 
[secondViewController2 release]; 
secondViewController2 = nil; 

正如你可以看到我發佈secondViewController2。

事情是,當我第一次執行它時,雖然在secondViewController2中調用了dealloc方法,但我仍然在儀器中觀察到一個額外的2MB似乎並沒有被釋放。沒有任何泄漏,我已經檢查過。

當我執行以下動作的所述第二,第三,第四時間等的dealloc獲取調用和我不遵守在存儲器的任何添加。僅憑這一點,我就不會在我的代碼中執行錯誤,因爲相同的代碼正在第一次,第二次第三次運行,但只有第一次大約2MB纔會被釋放。正如我聲明dealloc secondViewController2仍在運行!

有什麼想法?蘋果的機制是否存在缺陷?

+1

更好的嘗試*斜體*或**大膽**或***兩個***代替所有大寫。此外,'格式化代碼'。 – 2012-12-23 21:55:33

+0

請您可以顯示屬性secondViewController2的設置以及您正在使用的ivar和綜合。 – Fogmeister

+1

什麼是雙分配好?你不能只推'secV'並釋放它嗎? –

回答

2

首先,如果不分析完整的實施方案,就不可能徹底回答您的問題。但是,一般來說,如果我正確理解你的問題,我會說你描述的情況是正確的。

你應該認爲有些行爲肯定會對記憶佔用產生永久性影響。例如,如果通過[UIImage imageNamed]`將一些圖像加載到內存中,則圖像也將進入圖像緩存,當加載圖像的類被釋放時,圖像緩存將不會被清空。另一個很好的例子是單例:單例類在第一次實例化時佔用一些內存,並且通常永遠不會釋放它(在程序結束之前 - 當我說singleton時,也讀取任何類型的靜態全局變量)。

這些只是2個例子,但可能有更多的情況。它可以在你自己的代碼中完成,但它也可以通過你的控制器使用的某個框架完成。如果您的控制器是您在應用程序中使用某種功能實例化的第一個控制器,則此效果更有可能。但基本上,我不會在手之前就知道,但是隻能在通過儀器檢查您的程序行爲之後才能知道。

你真正有價值的信息是,在你的控制器類的實例連續/釋放,內存佔用不會增長。一般來說,這是兩件事的標誌:

  1. 你的類沒有內存泄漏;

  2. 類還沒有abandoned memory

1 + 2意味着什麼是你的程序的總內存消耗(只要你的控制器而言)是平的。 (雖然它有你在第一次使用時支付的費用)。

所以,在我看來,你的問題是由控制器內存使用的「優化」最多一個。正如我所說的,應該知道你的控制器究竟知道這些2MB是否來自某個緩存,或者其他什麼(並且在某些情況下它可能不在你的控制之下)。

希望它有幫助。

+0

謝謝!這確實有幫助。我通過儀器探索了內存泄漏和遺棄的內存,我描述的情況是在經歷了這些之後。在筆尖我有一些圖像(與按鈕和一些UIImageViews相關),我可以猜測,當筆尖被加載時,Xcode用imageNamed加載它們,但圖像沒有達到2MB ...也許使用Quartz Library警告這個單例像上傳發生? – justpicker