級別: ★☆☆☆☆
標籤:「Xcode靜態分析」「Analyze」「potential leak」
作者: Xs·H
審校: QiShare團隊
在iOS專案開發過程中,常用到靜態分析(Analyze)、斷點(Breakpoint)和控制檯(Console)進行程式碼除錯。本篇文章介紹Xcode常用除錯方法之“靜態分析”。
一、簡介
Xcode的靜態分析功能是在程式未執行的情況下,對程式碼的上下文語義、語法、和記憶體情況進行分析,可以檢測出程式碼潛在的文字本地化問題(Localizability Issue)、邏輯問題(Logic error)、記憶體問題(Memery error)、資料問題(Dead store)和語法問題(Core Foundation/Objective-C)等。功能入口在Xcode選單欄 -> Product -> Analyze
(Command+Shift+B)。圖示如下。

二、文字本地化問題
當工程Target -> Build Settings -> Static Analyzer
下的Missing Localizability
設定為YES
時,使用Analyze
功能後可以發現一些控制元件會提示文字本地化問題User-facing text should use localized string macro
。圖示如下:

按照提示,使用NSLocalizedString(<#key#>, <#comment#>)
修飾文字即可修復,圖示如下:

或者,將Missing Localizability
設定為NO
也可以。圖示如下:

三、邏輯問題
使用Analyze
可以分析出來程式碼中潛在的邏輯問題。比如直接使用NSNumber的物件作為條件時,會得到提示Converting a pointer value of type 'NSNumber *' to a primitive boolean value; instead, either compare the pointer to nil or call -boolValue
。圖示如下:

根據提示,我們有兩種修改方式,圖示如下:


雖然這兩種修改方式都能解決問題,但不完全一樣,要注意其中的差別,選擇需要的使用。
四、記憶體問題
雖然ARC
幫助開發者管理了大部分的記憶體問題。但像CGImageRef
等C系列的程式碼還需要開發者管理記憶體。這些記憶體問題在編譯過程中很難發現,但使用Analyze
可以給出相應的提示。圖示如下:

上圖中有兩處和記憶體相關的提示,開發者可以按照提示進行相應的修改。圖示如下:

五、資料問題
在編碼過程中,一些資料問題可以通過Analyze
很好的提示出來。比如下圖:

上圖中的string
被提示在初始化後從未被用到。是因為第二部的賦值操作為string重新申請了記憶體。這時,開發者去掉第一步初始化方法即可。圖示如下:

六、語法問題
在重寫類的init
方法時,有時會手誤寫出語法問題,這時可以使用Analyze
檢測出問題。圖示如下:

根據提示自己檢查可以知道是if
語句寫錯了,多了一個=
。修改如下:

總結
上述幾部分內容只是對Analyze
功能的舉例,其實際能檢測出的問題會更多。另外,Analyze
也有自己的侷限性,其檢查結果也只是輔助開發者查詢問題,真正優化程式碼需要開發者更多的技術經驗。
小編微信:可加並拉入《QiShare技術交流群》。

關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)
推薦文章:
iOS訊息轉發
iOS 自定義拖拽式控制元件:QiDragView
iOS 自定義卡片式控制元件:QiCardView
iOS Wireshark抓包
iOS Charles抓包
奇舞週刊