2010-06-04 26 views
4

我有一個內置5個視圖控制器的基於導航控制器的應用程序。當我推視圖控制器時,我分配了一些內存,當我回到popViewController時,正確調用了我的delloc()方法。我確定dealloc以正確的方式被調用,用於我推送和彈出的每個視圖控制器。不過,當我使用Instruments運行應用程序時(從性能工具 - >對象分配,泄漏開始),對我來說有一種奇怪的行爲。 當一個視圖控制器彈出內存使用不會減少,確切地說,它不會像預期的那樣減少: 當我啓動應用程序時,它使用950 KB,然後我推動第一個視圖控制器,內存使用量增加到1 ,56MB,最後我彈出視圖控制器,內存使用現在是1,55MB。當彈出一個控制器時,UINavigationController內存不會減少

這種行爲是否正確?我確信每當我彈出一個視圖時,每個dealloc方法都會被正確調用,並且Leaks儀器不會顯示任何內存泄漏。 我猜操作系統是「保留」在某種程度上的觀點,以便第二次我推動相同的視圖控制器的加載過程是更快...

有人可以確認這種行爲是正確的嗎? 感謝

See this Screenshot from Instruments

+0

Ps。儀器是否設置爲每X秒檢查一次泄漏或手動檢查? – RickiG 2010-06-04 10:23:46

+0

它設置爲每10秒自動檢查一次。會改變什麼嗎? – ggould75 2010-06-04 11:03:13

回答

6

這是符合市場預期。 「你只負責你分配,複製的對象」的內存處理規則也適用於此處。

當你到navigationController推的東西,我以爲你不喜歡這樣寫道:

MyController *myCon = [[MyController alloc] init]; 
[self.navigationController pushViewController:myCon animated:YES]; 
[myCon release]; //You have alloc and release. 

的navigationController經常處理的層級,其中用戶向下鑽取數據集,並再次向上。當內存充足時,通過抓住你的控制器,navigationControllers的保存方式必須再次實例化控制器5秒。稍後當用戶點擊「返回」時。你可以看到這個,因爲dealloc永遠不會被調用,但是當你備份時調用viewWillAppear和viewDidAppear。 如果內存不足,navigationController將開始在其堆棧上釋放控制器。

但是!確保前進和後退不會導致viewController被一次又一次地實例化,這會使內存佔用增加並出現泄漏。 navigationController應該注意到它已經在其堆棧中有viewController並且只顯示它。

你應該能夠遍歷所有的視圖,如果它們「適合」在內存中,應用程序不應該從這裏增加內存佔用。

+0

謝謝你的回覆。如你所描述的,我實例化視圖控制器。如果我理解的很好,那麼我可以假設,當點擊返回按鈕時,即使調用了dealloc方法,導航控制器也會「保留」我的控制器?是對的?因爲我的dealloc總是被調用(我使用的是nslog)。 我不太明白的一點是,如果它已經被釋放,它如何保留我的控制器?或者是保留在控制器內部的視圖? – ggould75 2010-06-04 11:56:56

+0

如何確保回退和前進不會導致viewControllers一次又一次地被實例化?當我點擊某個視圖時,它會更改導航欄而不是視圖。爲什麼? – ma11hew28 2010-09-03 02:29:45

+0

有道理@RickiG。你是從觀察還是從文檔中瞭解到這種行爲? – 2012-12-14 17:36:54

相關問題