天天看點

iOS - Analyze 靜态分析1、Analyze2、分析結果處理3、記憶體分析

使用 Xcode 自帶的靜态分析工具 Product -> Analyze(快捷鍵 command + shift + B)可以找出代碼潛在錯誤,如記憶體洩露,未使用函數和變量等。

iOS - Analyze 靜态分析1、Analyze2、分析結果處理3、記憶體分析

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

1、邏輯錯誤:通路空指針或未初始化的變量等;

2、記憶體管理錯誤:如記憶體洩漏等,比如 ARC 下,記憶體管理不包括 core foundation;

3、聲明錯誤:從未使用過的變量;

4、Api 調用錯誤:未包含使用的庫和架構。

<a href="https://developer.apple.com/library/ios/recipes/xcode_help-source_editor/chapters/Analyze.html">官方文檔 Xcode 執行靜态代碼分析視訊教程</a>

1、user-facing text should use localized string macro

面向使用者的文本應該使用本地化的字元串宏。此為代碼中配置了本地化,面向使用者的應該用字元串宏,而我們直接指派為漢字,是以此提示可以忽略。

2、instance variable used while 'self' is not set to the result of '[(super or self) init...]

修改為如下

3、Value stored to ‘durationValue’ during its initialization is never read

在初始化過程中存儲的 “持續時間值” 的值永遠不會被讀取

這是因為 [NSMutableArray alloc] init] 初始化配置設定了記憶體,而判斷語句裡面 [_onDemandDictionary objectForKey:key] 方法也相當于初始化配置設定了記憶體,就是把初始化的一個新的可變數組指派給之前已經初始化過的可變數組,看似沒什麼大問題,其實存在一個資料源卻申請了兩塊記憶體的問題,已經造成了記憶體洩露。

4、Potential leak of an object stored into 'imageRef'

imageRef 對象有記憶體洩漏

5、Analyze 邏輯錯誤監測

iOS - Analyze 靜态分析1、Analyze2、分析結果處理3、記憶體分析

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

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

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

所謂靜态記憶體分析,是指在程式沒運作的時候,通過 Xcode 自帶的靜态分析工具 Product -&gt; Analyze(快捷鍵 command + shift + B)對代碼直接進行分析。根據代碼的上下文的文法結構,讓編譯器分析記憶體情況,檢查是否有記憶體洩露。

缺點:靜态記憶體分析由于是編譯器根據代碼進行的判斷, 做出的判斷不一定會準确, 是以如果遇到提示, 應該去結合代碼上文檢查一下。

記憶體洩漏提示:Potential leak of an object stored into 'imageRef'

動态記憶體分析通過 Xcode 自帶的動态分析工具 Xcode -&gt; Product -&gt; Profile(Leaks 工具)動态的對記憶體進行分析,大多時候隻是堆記憶體的分析。

iOS - Analyze 靜态分析1、Analyze2、分析結果處理3、記憶體分析

imageNamed 和 imageWithContentOfFile 方法的比較。

1、imageName 加載圖檔

a、當 imageview 對象銷毀時候,圖檔對象不會随着一起銷毀。

b、加載的圖檔占據的記憶體比較大。

c、相同的圖檔隻會加載一份到記憶體中,如果同時使用,使用的是同一個圖檔對象。

2、imageWithContentOfFile 加載圖檔

a、當 imageView 對象銷毀的時候,圖檔對象會随着一起銷毀。

b、加載的圖檔占用的記憶體比較小。

c、相同的圖檔對象會多次加載到記憶體中,如果同時使用圖檔,使用的是不同的對象。

總結

imageName:如果一些圖檔在多個界面都會使用,并且圖檔較小,使用頻率高,(圖示/小的背景圖)。

imageWithContentOfFile:隻在一個地方使用,并且圖檔比較大,使用頻率不高,(相冊/版本新特性)。

繼續閱讀