前言
使用Xcode自帶的靜態(tài)分析工具 Product->Analyze(快捷鍵command+shift+B)可以找出代碼潛在錯誤,如內(nèi)存泄露,未使用函數(shù)和變量等
所謂靜態(tài)內(nèi)存分析, 是指在程序沒運行的時候, 通過工具對代碼直接進行分析
根據(jù)代碼的上下文的語法結(jié)構(gòu), 讓編譯器分析內(nèi)存情況, 檢查是否有內(nèi)存泄露
Analyze主要分析以下四種問題:
1、邏輯錯誤:訪問空指針或未初始化的變量等;
2降传、內(nèi)存管理錯誤:如內(nèi)存泄漏等拜轨; 比如ARC下,內(nèi)存管理不包括core foundation
3纳本、聲明錯誤:從未使用過的變量骇两;
4宴咧、Api調(diào)用錯誤:未包含使用的庫和框架朝群。
缺點: 靜態(tài)內(nèi)存分析由于是編譯器根據(jù)代碼進行的判斷, 做出的判斷不一定會準確, 因此如果遇到提示, 應(yīng)該去結(jié)合代碼上文檢查一下
常見的問題如下
一:Localizability issue(Apple)
// 面向用戶的文本應(yīng)該使用本地化的字符串宏
1.user-facing text should use localized string macro
此為代碼中配置了本地化,面向用戶的應(yīng)該用字符串宏,而我們直接賦值為漢字,因此,此提示可以忽略.也可以通過如下修改進行編譯器隱藏
二:Core Foundation/Objective-C
// 這個是提示錯誤
1.Returning ?'self' while it is not set to the result of '[(super or self) init...]'
解決辦法:去除if條件中的一個 = 既可,改為 if (self=[super initWithFrame:frame]) {}
三:Dead store
// 在初始化過程中存儲的“持續(xù)時間值”的值永遠不會被讀取1.Value stored to ‘dateFromString’ during its initialization is never read
這是因為? NSDate *dateFromString=[[NSDate alloc] init];? 初始化分配了內(nèi)存燕耿,而? [dateFormatter dateFromString:dateString]; 方法也相當于初始化分配了內(nèi)存,就是把初始化的一個新的NSDate賦值給之前已經(jīng)初始化過的NSDate姜胖,看似沒什么大問題誉帅,其實存在一個數(shù)據(jù)源卻申請了兩塊內(nèi)存的問題,已經(jīng)造成了內(nèi)存泄露右莱。
修改如下:
// ''中的值永遠不會讀取
2.Value stored to ‘isDefaultDrawLine’ ?is never read
這是因為我這個變量 isDefaultDrawLine 沒有在這個方法中被使用蚜锨,只是對其賦值了, 從我的截圖中可以看出。所以解決方法是去掉這個變量,因為用不著慢蜓。
四:Logic Error
// 下標是一個未初始化的值
1.Subscrpt index is an uninitialized value
如截圖所示,我上面紅色箭頭所指的沒有初始化,自己初始化一個值既可亚再!
//在信息表達的觀點是一個未初始化的值
2.Argument in message expression is an uninitialized value
如圖所示,我這里的 isEquel 就是沒有初始化一個值,自己初始化YES/NO既可。
//未定義或返回垃圾值
3.undefined or garbage value return to caller
如圖所示,將我這里的isSucceed 初始化YES/NO既可晨抡。
五:Memory error
//在返回非空值的方法返回了null
1.null is returned from a method that is expected to return a? non-null value
如圖所示,返回一個UICollectionReusableView對象即可氛悬!
六:API Misuse(Apple)
//字典的鍵可能為空
1.'NSMutableDictionary' ?key cannot be nil
將字典的鍵初始化一個默認值则剃。