1. 程式人生 > >使用Analyze靜態分析程式碼

使用Analyze靜態分析程式碼

在Xcode的工具欄中,有一個Product,Product裡面的工具,可以說是Xcode中比較強大的,工程效能的調優都依賴於這些。

這篇就簡單說下Analyze,畢竟現在都用ARC開發,如不使用CoreFoundation開發,記憶體洩露的情況不容易發生。

Analyze主要的作用有:

  • 記憶體洩露檢查 Memory Error
  • 邏輯錯誤檢查 Logic Error
  • 宣告錯誤檢查 Dead Store
  • API呼叫錯誤檢查 API Misuse

點選Analyze後,Xcode會自動進行編譯分析,需要一段時間,之後會像提示警告一樣,提示有多少分析的結果。

所有的分析結果按照如上的類別,歸類顯示。點選某個錯誤的地方,會定位到出錯的地方,然後點擊向上向下的箭頭,會詳細展示出出錯的步驟。


1、記憶體洩露檢查 Memory Error

一般來說都是由於使用的CoreFoundation後沒有release造成的。在RAC下Foundation框架下的不需要進行release,CoreFoundation框架下仍然需要release。

如下:如果沒有CGPathRelease(path);就會造成記憶體洩露,path的retainCount在這段程式碼使用後仍未retainCount+1。


2、邏輯錯誤檢查 Logic Error

- (NSInteger)typeIndexStatus:(NSString *)status
{
    NSInteger index;
    if ([status isEqualToString:@"正常"]) {
        index = 1;
    }else if ([status isEqualToString:@"遲到"]){
        index = 2;
    }else if ([status isEqualToString:@"早退"]){
        index = 3;
    }else if ([status isEqualToString:@"缺卡"]){
        index = 4;
    }else if ([status isEqualToString:@"請假"]){
        index = 5;
    }else if ([status isEqualToString:@"外勤"]){
        index = 6;
    }else if ([status isEqualToString:@"曠工"]){
        index = 7;
    }
    return index;
}

初看這段程式碼,並沒有覺得有什麼不妥,根據字串獲得index的值。這個前提是字串一定要按照這個規則提供,如果沒有按照這個規則提供,則index就沒有值。

通過Analyze分析,就檢查出來了。



3、宣告錯誤檢查 Dead Store

很多時候我們建立了一些中間變數需要使用,但是在最終功能的實現上並沒有用到這個變數。

但是這些變數依然留在程式碼中,沒有刪除。這就造成了記憶體的不必要的開銷。

這對這部分變數,不需要的時候就要及時的刪除。

同理:

建立類宣告的屬性,如果沒有用到就要及時刪除。因為建立類時,會根據類的屬性的多少建立對應的記憶體。


4、API呼叫錯誤檢查 API Misuse

API的錯誤,一般是在打段的邏輯處理中沒有注意OC的使用細節。如:陣列不能新增空值,陣列的元素不能是空值,字典的value不能是空等等。

下面這段程式碼:

photo的初始值為空,經過一段邏輯處理後,還是有可能是空,是不能新增到陣列中的。