2014-04-28 22 views
1

我正在運行一個測試,以確保通過在10秒長的while循環中包裝相關代碼部分來正確釋放對象。我在調試和發佈配置中運行了測試,結果不同。在Release和Debug配置之間會導致不同的ObjC/ARC內存行爲?

調試(構建在模擬器&執行命令):

Debug

推出(構建在設備&運行,並利用簡介儀表):

Release

的CPU峯值表示創建對象的位置,以及d被毀壞(每次運行有3次)。請注意,如何在Debug版本中,在繁忙循環期間內存使用量逐漸增加,然後在較高基本級別稍微穩定下來,這發生在每次循環迭代時。在發佈版本上,它始終保持不變。在3次運行結束後,Debug版本的內存使用水平顯着高於Release版本。 (CPU峯值在時間軸上相對於彼此偏移,但這只是因爲我按下了在不同時間觸發循環的按鈕)。

有問題的內部循環的代碼非常簡單,基本上是由一串正確配對mallocfree報表以及一堆retainrelease電話(ARC的禮貌,也驗證爲正確配對)的。

任何想法是什麼造成這種行爲?

+0

相關:http://stackoverflow.com/questions/17208685/different-block-behavior-between- debug-and-release-configuration –

回答

0

許多Cocoa-Touch類使用緩存來提高性能。用於緩存數據的內存量可能因總內存,可用內存以及其他可能的內容而異。由於您比較Mac和設備的結果,因此您收到不同的結果並不奇怪。的類/

一些例子使用高速緩存方法:

+(的UIImage *)imageNamed:(的NSString *)名稱

討論

這種方法看起來在系統中的高速緩存對於具有指定名稱的圖像對象和 將返回該對象(如果存在)。如果匹配的圖像對象不是 已存在於緩存中,則此方法從指定文件加載指定文件的圖像數據,對其進行緩存,然後返回結果對象。

NSURLCache

的NSURLCache類實現的,以通過映射 URL加載請求的NSURLRequest對象到 NSCachedURLResponse對象響應的高速緩存。它提供了一個複合內存和 磁盤緩存

3

在發佈版本ARC將盡最大努力保持對象不在autorelease池。它使用objc_returnsRetainAutorelease並在運行時檢查它。

+1

這可以解釋爲什麼在循環期間內存使用量保持不變。但是,這會影響執行結束時的內存使用量高一個數量級嗎?我會認爲運行循環會結束,因此在測試代碼結束時會釋放池(在圖形上CPU峯值下降到0的位置)? – lms

0

首先,發行版會優化代碼並從代碼中移除調試信息。結果,應用程序包明顯更小並且加載它,所需內存更少。

我想,大多數調試使用的內存的建立是實際的調試信息,殭屍跟蹤等

相關問題