IOS性能調優系列:使用Instruments動態分析內存泄漏

硬廣:《IOS性能調優系列》第二篇,持續更新,歡迎關注。html

第一篇介紹了Analyze對App作靜態分析,能夠發現應用中的內存泄漏問題,對於有些內存泄漏狀況經過靜態分析沒法解決的,能夠經過動態分析來發現,分析起來更有針對性。函數

從本篇開始介紹XCode提供的強大的分析工具Instruments,內存分析只是Instruments中的一個功能,其餘功能後續介紹。工具

使用Instruments動態分析內存泄漏性能


 Instruments中的Leaks功能主要用於分析內存泄漏,仍是以《IOS性能調優系列:Analyze靜態分析》裏內存泄漏的例子還實驗:spa

 1 //截取部分圖像
 2 +(UIImage*)getSubImage:(unsigned long)ulUserHeader
 3 {
 4     UIImage * sourceImage = [UIImage imageNamed:@"header.png"];
 5     CGFloat height = sourceImage.size.height;
 6     CGRect rect = CGRectMake(0 + ulUserHeader*height, 0, height, height);
 7      
 8     CGImageRef imageRef = CGImageCreateWithImageInRect([sourceImage CGImage], rect);
 9     UIImage* smallImage = [UIImage imageWithCGImage:imageRef];
10     //CGImageRelease(imageRef);
11      
12     return smallImage;
13 }

用註釋註釋掉CGImageRelease(imageRef)這行,即便在ARC開啓的環境下,仍然會致使內存泄漏(Arc is only for NSObject)。指針

使用Leaks開始動態分析,點擊XCode的Product菜單Profile啓動Instruments:調試

選擇Leaks,會自動啓動Leaks工具和IOS模擬器:code

Leaks啓動後會開始錄製,隨着對模擬器運行的App的操做,能夠在Leaks中查看內存佔用的狀況。htm

注:若是你的項目使用了ARC,隨着你的操做,不斷開啓或關閉視圖,內存可能持續上升,但這不必定表示存在內存泄漏,ARC釋放的時機是不固定的。對象

Leaks頂部分爲兩欄:Allocations和Leaks,右側的曲線表明內存分配和內存泄漏曲線。

點擊第二欄Leaks,進行內存泄漏分析,左下角會出現Leaks調試的選項:

建議把Snapshot Interval間隔時間設置爲10秒,勾選Automatic Snapshotting,Leaks會自動進行內存捕捉分析。

在你懷疑有內存泄漏的操做前和操做後,能夠點擊Snapshot Now進行手動捕捉。

如下是切換到個人App中調用 +(UIImage*)getSubImage:(unsigned long)ulUserHeader 函數的視圖,能夠發現內存泄漏:

Leaked Object的表格中顯示了內存泄漏的類型、數量及內存空間。

點擊具體的某個內存泄漏對象,在右側Detail窗口中會出現致使泄漏可能的位置,其中黑色頭像表明了最可能的位置。

Leaks已成功找出了[CMTool getSubImage:]這個函數:

內存泄漏動態分析技巧


 

熟練使用Leaks後會對內存泄漏判斷更準確,在可能致使泄漏的操做裏,多使用Snapshot Now手動捕捉。

開始時若是設備性能較好,能夠把自動捕捉間隔設置爲5秒鐘。

使用ARC的項目,通常內存泄漏都是malloc、自定義結構、資源引發的,多注意這些地方進行分析。

開啓ARC後,內存泄漏的緣由


開啓了ARC並非就不會存在內存問題,蘋果有句名言:ARC is only for NSObject。

在IOS 中使用malloc分配的內存,ARC是不會處理的,須要本身進行處理。

例子中的 CGImageRef 也是一個Image的指針,ARC也不會進行處理。


記錄,爲更好的本身!

相關文章
相關標籤/搜索