2009-08-25 44 views
6

alt text瞭解儀器的內存泄漏檢查 - iPhone

上面給出的圖像是我的應用程序泄漏。

在這裏,我想了解的是,在擴展細節 - 你可以看到不同的顏色,如淺綠色,淡粉色,淺棕色,淺紫色。

每種顏色表示什麼?

現在另一個混淆是「如何找到正在創建內存泄漏的代碼?」

高達內存泄漏的限制 - 實際的iPhone可以繼續。 (假設10個字節沒有問題的,20個字節沒有問題& 200字節的一個問題)

  • 什麼每種顏色表示?
  • 哪種顏色表示我們的代碼/從哪個細節我們可以得到我們已經分配對象的代碼&忘了釋放它?

(例如 - 論UIKit的詳細第二小區的點擊 - 我們不能得到的代碼)

  • 爲什麼我們必須解決所有的泄漏? - 即使是單一的泄漏也會堵塞iPhone?
  • 爲什麼iPhone允許泄漏留在內存中? /爲什麼終止應用程序後垃圾回收不會自動完成?
  • 如果我嘗試釋放應根據儀器釋放的對象,我的應用程序異常終止。如果我不dealloc,我的應用程序運行完美,如何?
  • 爲什麼建議您在視圖中等待10秒或更長時間,如果有泄漏,儀器會檢測到泄漏?

回答

14

忽略的顏色,在一個[儀表板式viewDidLoad中]是泄漏的源頭,東西在它如何初始化一個URLConnection(可能是你沒有自由,當連接已完成了嗎?)

我們回答您的其他問題:

  • 爲什麼我們必須解決所有泄漏? - 即使是單一的泄漏也可以阻止iPhone的使用 ?

是。部分原因不僅僅是因爲內存耗盡,而且由於整個手機只有很多內存可供使用,因此看門狗應用程序會不斷監視您的應用程序,並且如果它看到內存使用會提前關閉它只有不斷增長...

  • 爲什麼iPhone允許內存泄漏 ? /爲什麼垃圾回收 不是在 終止申請後自動完成的?當應用程序退出

所有應用程序內存被釋放。

  • 如果我嘗試的dealloc這 應根據 儀器被釋放的對象,我的應用程序 異常終止。如果我不 dealloc,我的應用程序完美運行 ,如何?

在這裏,我忍不住了,你真的需要更多的保留/釋放內存週期...如果你釋放出具有爲0的保留計數的對象,應用程序崩潰,因爲對象是走了。

  • 爲什麼,建議您在 視圖最多等待10秒以上,如果 有泄漏,泄漏會被儀器檢測到 ?

因爲儀器每隔一段時間都要通過對存儲器進行採樣來工作,所以儀器在操作後可能需要一點點時間來讀取內存。

+2

+1優秀的答案肯德爾。 @sagar,你應該注意,對於問題3,你應該*永遠不*直接調用dealloc,只保留或釋放(只有異常是[super dealloc])。我相信你的解決方案是實現自動釋放,因爲它聽起來像你的崩潰是由早釋放對象造成的。例如[[[[NSArray alloc] init] autorelease]; – h4xxr

3

顏色表示調用堆棧正在經歷的不同庫。

泄漏是由您的代碼中進行分配的框架引起的,即使實際分配發生在OS庫的深處。儀器正在向您顯示正好泄漏的內存被分配。你必須找出代碼中的哪一行導致泄漏的分配,這將是右邊堆棧中的一個框架。

實際的iPhone沒有太多的RAM可用於您的應用程序。我傾向於保守估計我的應用程序要使用大約25MB的RAM。任何泄漏,無論多小,如果代碼被充分利用,就可以淹沒公用船。

5

首先,堆棧中的東西被它們來自哪個庫着色,所以它不包含那麼多的信息。其次,不要擔心iPhone可以承受多少泄漏,我會專注於不泄漏它。

要找到泄漏,有幾個選項:

  • 使用CLANG static analyzer建設項目
  • 查找手動泄漏時。你必須始終遵循內存管理規則:如果你allocretain,或copy對象(包括使用@property (retain)(copy)),你必須releaseautorelease它。
1

在堆棧擴展視圖中查找您的應用程序名稱。內存分配通常顯示在最後,因此您確切知道哪個庫負責內存分配。所以你應該從你的代碼向下看直到結束。顏色只是更容易跟蹤與相同庫相關的代碼行。相同的庫調用將使用相同的顏色着色。

至於追蹤泄漏本身。首先通過雙擊擴展視圖中的行來進入應用程序調用,並嘗試瞭解究竟是什麼泄漏。有時您可以用不漏水的替代品替換泄漏的電話。例如,我使用imageNamed調用來從包中檢索圖像,由於內存不足,應用程序不斷崩潰。我只是GOOGLE了imageNamed泄漏,並發現如何在我的應用程序中實現圖像現金非常有用的文章。的確,imageNamed API泄漏。 iPhone SDK中有泄漏的API。

此外,嘗試檢查如何你與頁頭工作/保留/釋放等,無論你釋放或自動釋放你分配的內存。

祝你好運在你的偵探工作。

+0

@Nava Carmon - 如果你有鏈接的API泄漏。你能否把它放在你的答案中。謝謝。 –

0

我也有儀器泄漏問題。我今天第一次運行我的應用程序使用泄漏,發現了幾處泄漏。泄漏不應該泄漏,因爲沒有辦法讓他們泄漏,除非一些神奇的代碼正在執行並提高我的對象的保留數。我瞭解內存管理指南,知道如何使用autorelease池等。但即使是一個空的基於視圖的應用程序包含泄漏,如果我把它放在一些控制。只需點擊2-3次即可。繼續嘗試。我並不真正瞭解信息工具試圖提供的信息。這些「泄漏」是真的泄漏,還是隻是對儀器應用程序有疑問的事情?如果一個沒有用戶代碼的空應用程序,只有幾個控件放在一個空視圖泄漏內存?

+0

我不相信他們是可疑的「事物」。泄漏儀器檢查應用程序的可寫存儲器,寄存器和堆棧中是否存在對存儲器塊的引用。如果沒有,並且內存塊仍然存在,則儀器將緩衝區視爲泄漏。 – hmak

+0

這是模擬器還是設備?我發現在模擬器上檢測到的「泄漏」在實際設備上運行時不會顯示出來,所以我不再打擾模擬器上的性能泄漏。 – daver

+0

設備上的泄漏情況有所不同,一般情況下較少。我停止開發iphone。 –