你好,歡迎來到IOS教程網

 Ios教程網 >> IOS使用技巧 >> IOS技巧綜合 >> IOS性能調優系列:使用Instruments動態分析內存洩漏

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

編輯:IOS技巧綜合
[摘要]本文是對IOS性能調優系列:使用Instruments動態分析內存洩漏的講解,對學習IOS蘋果軟件開發有所幫助,與大家分享。

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

第一篇介紹了Analyze對App做靜態分析,可以發現應用中的內存洩漏問題,對於有些內存洩漏情況通過靜態分析無法解決的,可以通過動態分析來發現,分析起來更有針對性。

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

使用Instruments動態分析內存洩漏


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

 //截取部分圖像
 +(UIImage*)getSubImage:(unsigned long)ulUserHeader
 {
     UIImage * sourceImage = [UIImage imageNamed:@"header.png"];
     CGFloat height = sourceImage.size.height;
     CGRect rect = CGRectMake(0 + ulUserHeader*height, 0, height, height);
      
     CGImageRef imageRef = CGImageCreateWithImageInRect([sourceImage CGImage], rect);
     UIImage* smallImage = [UIImage imageWithCGImage:imageRef];
     //CGImageRelease(imageRef);
      
     return smallImage;
 }

用注釋注釋掉CGImageRelease(imageRef)這行,即使在ARC開啟的環境下,仍然會導致內存洩漏(Arc is only for NSObject)。

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

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

Leaks啟動後會開始錄制,隨著對模擬器運行的App的操作,可以在Leaks中查看內存占用的情況。

注:如果你的項目使用了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也不會進行處理。


記錄,為更好的自己!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved