前言
使用Xcode自帶的靜態分析工具 Product->Analyze(快捷鍵command+shift+B)可以找出代碼潛在錯誤,如內存泄露,未使用函數和變量等
所謂靜態內存分析, 是指在程序沒運行的時候, 通過工具對代碼直接進行分析
根據代碼的上下文的語法結構, 讓編譯器分析內存情況, 檢查是否有內存泄露
Analyze主要分析以下四種問題:
1、邏輯錯誤:訪問空指針或未初始化的變量等;
2、內存管理錯誤:如內存泄漏等; 比如ARC下,內存管理不包括core foundation
3、聲明錯誤:從未使用過的變量;
4、Api調用錯誤:未包含使用的庫和框架。
缺點: 靜態內存分析由于是編譯器根據代碼進行的判斷, 做出的判斷不一定會準確, 因此如果遇到提示, 應該去結合代碼上文檢查一下
常見的問題如下
一:Localizability issue(Apple)
// 面向用戶的文本應該使用本地化的字符串宏
1.user-facing text should use localized string macro
此為代碼中配置了本地化,面向用戶的應該用字符串宏,而我們直接賦值為漢字,因此,此提示可以忽略.也可以通過如下修改進行編譯器隱藏
二: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
// 在初始化過程中存儲的“持續時間值”的值永遠不會被讀取1.Value stored to ‘dateFromString’ during its initialization is never read
這是因為? NSDate *dateFromString=[[NSDate alloc] init];? 初始化分配了內存,而? [dateFormatter dateFromString:dateString]; 方法也相當于初始化分配了內存,就是把初始化的一個新的NSDate賦值給之前已經初始化過的NSDate,看似沒什么大問題,其實存在一個數據源卻申請了兩塊內存的問題,已經造成了內存泄露。
修改如下:
// ''中的值永遠不會讀取
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
將字典的鍵初始化一個默認值。