使用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的初始值為空,經過一段邏輯處理後,還是有可能是空,是不能新增到陣列中的。