2012-07-19 135 views
1

我有一些關於內存管理的問題。我正在使用ARC,xcode 4.2.1,部署到ios 5.0+iOS內存管理工具

1)您如何知道您的應用何時有效且正確地管理內存?如果它沒有泄漏內存,就像您在儀器泄漏工具中測量的那樣,那麼您的應用程序是否完全健康?

2)我是否應該使用漏洞以外的其他工具來確定我的應用程序是否正在管理內存?

3)當我繼續運行我的應用程序時,我的活動字節數不斷增加。我的應用程序有一個UITableView顯示一些數據。當用戶點擊一行時,我會將它們帶到更詳細的頁面。如果這是我所有的應用程序正在做的事情,那麼爲什麼我的活動字節會繼續增長?不應該釋放所有對象,將我的活動字節下降到我第一次啓動應用程序時的情況?

4)什麼是malloc?

我即將完成應用程序,我只想知道如何衡量應用程序是否可釋放,以及如何識別任何問題。

謝謝!

+0

對「我的活動字節不斷增長」的一個評論:不要使用Allocations來查看您的總應用程序大小,因爲它可以隱藏所有內容。相反,使用內存監視器來準確評估您的內存總大小。你會對差異感到驚訝。 – 2012-07-19 01:22:51

回答

3

你怎麼知道你的應用程序何時有效且正確地管理內存?

  • 它看起來是在給定的存儲合理數量的任何數據它在運行運行,或者它使用比你期望有更多的內存?

  • 當程序沒有做任何事時,它的內存使用是否合理穩定?

  • 如果您徹底運用程序,內存使用是否穩定或似乎無限增長?

  • 您的程序是否正確響應來自操作系統的內存警告?

  • 它是否容忍低內存條件優雅?

我應該使用比其他泄漏等工具,以確定是否我的應用程序 是管理內存呢?

Instruments中的各種工具應該足以幫助您瞭解應用程序如何使用內存。您可能需要考慮的一件事就是保存樂器會話中的結果以及一些註釋,以便您可以看到應用程序的內存使用情況隨時間如何變化。

當我繼續運行我的應用程序時,我的活動字節數不斷增長。

這可能是也可能不是問題;這將有助於瞭解哪些塊在不斷增加。如果設備上有可用的內存,使用它並沒有什麼問題,尤其是如果這意味着您的應用性能更好,可以避免從某些來源下載類似的數據等。但是,如果您的應用不斷分配新的視圖控制器和視圖而不釋放舊的,這可能是一個泄漏。

究竟是一個malloc?

malloc()是C標準庫中的內存分配函數之一。我有你的要求,因爲你看到線條狀malloc的16字節在爲分配儀器類別列的感慨:

illustration from Instruments

這些線代表被分配的內存塊的類別malloc()。正如你所看到的,在我的情況下,我的程序中目前正在使用的malloc()有3318個16字節塊。確切的數字並不重要 - 你關心的是這個數字隨着時間的推移如何變化。如果您發現使用了一定數量的malloc()塊,並且每次執行某些操作時都不會釋放塊,則您會知道在程序中何處查找內存問題。 (當然,其他類型的塊也是如此)。

2
  1. 你怎麼知道你的應用程序何時有效且正確地管理內存?你知道它沒有泄漏,並且你的內存大小不會增長,除非有原因。蘋果已經發布了許多內容豐富的視頻,如WWDC 2012「iOS應用程序性能:內存」和WWDC 2010「儀器高級內存分析」。

  2. 泄漏將幫助您找到無法訪問的內存:您的程序無法再訪問它。它不會幫助您找到可以訪問但無用的內存:無限制增長的緩存或不斷獲取隱藏舊子視圖的新子視圖的視圖。隨着時間的推移,您可以使用分配工具查看分配內存的內容。基本技巧是點擊「標記堆」,執行一些你認爲應該導致分配淨變化的操作(在你的應用程序中),然後再次標記堆並查看應該釋放的新內容。再次,蘋果公司的視頻更詳細地解釋了這一點。

  3. 參見#2。

  4. 現在已經有答案的計算器是解決這個問題,像這樣的:

How is malloc() implemented internally?
How do malloc() and free() work?
How do free and malloc work in C?

和網頁,如這些:

http://en.wikipedia.org/wiki/C_dynamic_memory_allocation
http://web.eecs.utk.edu/~huangj/cs360/360/notes/Malloc1/lecture.html

+0

關於#2,不要忘記Bill Bumgarner在這裏的精彩文章:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using -heapshot-analysis-to-find-undesirable-memory-growth /正確使用堆鏡頭。 – 2012-07-19 01:21:57

1

1)這取決於您的應用程序的功能。如果您正在運行一個執行簡單任務的簡單應用程序,則高效的內存使用率並不是什麼大不了的事情。您更專注於編寫一個裸露的內存小應用程序。但是,如果您的項目需要肌肉,或者進行強烈的計算,那麼內存優化完全側重於修剪邊緣周圍的脂肪。

2)當然。殭屍,分配,甚至是時間分析器都可以幫助你管理物體的生命週期。

3)你的應用程序實際上應該使用你描述的增加的內存量。您似乎期望導航堆棧將視圖控制器釋放到堆棧上方,這與導航堆棧存在的原因完全相反。當你將更多的視圖控制器推入堆棧時,內存使用量會增加,因爲現在有一個新的視圖控制器需要管理。如果你的應用程序正在刪除大部分內存,這將是值得擔心的事情,因爲那樣你會遇到殭屍對象的主要問題。

4)malloc是alloc的C版本。唯一的區別是alloc在執行一些運行時魔法並設置類的isa指針,並在最終調用malloc之前調整一些次要的每個對象的值。 Malloc分配一塊內存,並返回一個指向該對象的指針。這就是爲什麼你只分配對象,而不是原語(注意原語可以指向,然後確實需要malloc),因爲你需要一個有效的指針,它本身就是一塊內存。

+0

#4需要工作。 'malloc()'和'+ alloc'在概念上可能相似,因爲它們都分配內存,但它在那裏結束。例如,你一次只能「分配」一個對象,而你可以「malloc()」一個任意大小的塊。開始「這就是爲什麼......」的線似乎沒有遵循前面的討論。更好地說,「malloc()是一個C內存分配函數」,並將其留在那裏。 – Caleb 2012-07-19 01:21:02

+0

謝謝!你能否跟進#3 - 這真的讓我感到困擾。 使用表視圖,用戶單擊一行並將它們帶到一個新的UIViewController中,並帶有詳細的描述。當他們點擊導航欄中的後退按鈕時,詳細的ViewController究竟發生了什麼? 在蘋果wwdc講座上,他們說應該有一個淨變化零!但是,我的堆增加了大約1-2mb,最終我的應用崩潰了。我想把它降到零MB。 你能解釋爲什麼我應該使用越來越多的內存? 再次感謝! – user1467188 2012-07-19 18:55:28

+0

當您離開時,是的,內存應該會有所下降,並且總體堆增加爲零。但是當你將更多的視圖控制器推入堆棧而不釋放它們或導航時,你的內存使用量應該會增加。 – CodaFi 2012-07-19 19:03:52