2

我有一個基於導航控制器的應用程序,它可以在很長一段時間內處於活動狀態,並可以加載多個屏幕,在其生命週期中重新訪問一些業務應用程序。當我推動屏幕時,我分配一些內存;當我回去(彈出它)我需要確保內存不會丟失。基於導航控制器的應用程序中的內存使用情況記帳;

現在在泄漏我有一個乾淨的石板。沒有內存泄漏,與10.6靜態分析功能不太相關,並且使用儀器進行了確認。手動檢查,我確定我將viewWillAppear中分配的所有內容都放在viewWillDisappear中;在viewDidUnload中的viewDidLoad中分配的所有內容;在dealloc中另有分配。

我已經在開發中使用了NSZombiesEnabled,但是我現在肯定沒有它。

當在對象分配下運行時,我看到內存使用量在增長。在進入一個新的視圖時,我看到記憶在增加,但在回航時沒有減少相同的數量。這也不是簡單的系統不能立即釋放,當一段時間留下記憶保持靜止。這種行爲在每個視圖中都可以看到。

我可以使用什麼技術來隔離此內存?我應該瞄準應用程序在每個視圖後返回到某個基線嗎?如何隔離子系統(如核心數據)使用的內存報告,我依賴於錯誤來加載對象,而不應該試圖明確地操作它們,以及我完全控制的代碼?

回答

0

當您向其推送視圖時,導航控制器的內存佔用率會不斷增長。 如果您正在使用核心數據,那麼您可以在每次推送或彈出視圖時將整個應用程序的狀態持久化爲核心數據。這樣,沒有什麼會丟失。 navigationController管理viewControllers的內存,所以如果你超過了iPhone內存,它將開始釋放viewControllers。核心數據管理內存非常積極,所以這是一個好方法。

通過這種方法,我想你會使用框架,而不是試圖推出自己的內存管理,並可能引入長期的內存錯誤:)

我會去像每一個的viewController實體,以及一個保存已加載的上下文的實體。這樣你就可以測試一下,看看框架是否已經釋放了你的任何viewController,然後如果有的話還原navigationController棧。

希望這是至少要考慮的事情:)

+0

感謝 - 我害怕知道答案「只是寒意」 ......但感覺不對,看看內存增加這樣的。 – 2009-11-23 01:13:27

+0

我知道:) 我正在做我的第一個「大型」應用程序,我真的很擔心iPhone在懶散的內存管理方面會採取什麼措施。我拉着1400 - 16.000項目列表,一次在導航控制器7-8中堆疊自定義的UITableViews,使用半複雜的核心數據設置和解析Web服務中的巨大xml文件,預加載最多20頁的scrollView/pageControl效果在不同的線程。我認爲這將是一個內存管理的噩夢:)我幾乎完成,內存永遠不會超過3 MB。我認爲1G iPhone大約有20MB,而3GS則有很多倍。 – RickiG 2009-11-23 07:51:52

+0

當你說它不斷增加時,在它停止之前它有多大以MB爲單位? – RickiG 2009-11-23 07:53:27

相關問題