iOS效能調優之Analyze靜態分析

全棧工程獅發表於2015-03-02

目前關於IOS效能優化的教程較少,決定寫一個《IOS效能調優系列》,主要關注與記憶體洩漏、效能優化、流量和電量分析幾個方面。

XCode已經提供了非常強大的效能調優工具,結合幾個第三方工具和一些技巧,進行效能優化非常簡單。

第一篇先寫寫最簡單的,Analyze靜態分析。

相信IOS開發者在App進行Build或Archive時,會產生很多編譯警告,這些警告是編譯時產生的,靜態分析的過程也類似,在XCode Product選單下,點選Analyze對App進行靜態分析。

Analyze主要分析以下四種問題:

1、邏輯錯誤:訪問空指標或未初始化的變數等;

2、記憶體管理錯誤:如記憶體洩漏等;

3、宣告錯誤:從未使用過的變數;

4、Api呼叫錯誤:未包含使用的庫和框架。

Analyze記憶體洩漏分析:

宣告錯誤、邏輯錯誤、Api呼叫錯誤基本在編譯時都會有警告,Analyze的主要優勢在於靜態分析記憶體洩漏及程式碼邏輯錯誤。

比如在開啟arc的環境下,輸入以下一段程式碼:

//擷取部分影像
+(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,不過仍然會導致imageRef物件洩漏。

使用Analyze進行分析,在導航欄Analyze選擇Analyzer檢視分析結果:

Analyze已經分析出imageRef物件有記憶體洩漏,這種情況在編譯時是無法發現的。

如果你沒有使用ARC,那麼Analyze更有用。

Analyze的其他三種分析也可以使用,相比編譯器給出的資訊更明確。

Analyze邏輯錯誤監測:

這種情況在codereview時也較難發現,可以藉助Analyze。

如上程式碼,當Tag不等於1、2和3的時候,就會出現很問題了。

Analyze還給出了箭頭提示:len is a garbage value。建議在宣告變數時,同時進行初始化。

相關文章