iOS 常用除錯方法:靜態分析

QiShare發表於2019-03-04

級別: ★☆☆☆☆
標籤:「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)。圖示如下。

iOS 常用除錯方法:靜態分析

二、文字本地化問題

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

iOS 常用除錯方法:靜態分析

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

iOS 常用除錯方法:靜態分析

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

iOS 常用除錯方法:靜態分析

三、邏輯問題

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

iOS 常用除錯方法:靜態分析

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

iOS 常用除錯方法:靜態分析

iOS 常用除錯方法:靜態分析

雖然這兩種修改方式都能解決問題,但不完全一樣,要注意其中的差別,選擇需要的使用。

四、記憶體問題

雖然ARC幫助開發者管理了大部分的記憶體問題。但像CGImageRef等C系列的程式碼還需要開發者管理記憶體。這些記憶體問題在編譯過程中很難發現,但使用Analyze可以給出相應的提示。圖示如下:

iOS 常用除錯方法:靜態分析

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

iOS 常用除錯方法:靜態分析

五、資料問題

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

iOS 常用除錯方法:靜態分析

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

iOS 常用除錯方法:靜態分析

六、語法問題

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

iOS 常用除錯方法:靜態分析

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

iOS 常用除錯方法:靜態分析

總結

上述幾部分內容只是對Analyze功能的舉例,其實際能檢測出的問題會更多。另外,Analyze也有自己的侷限性,其檢查結果也只是輔助開發者查詢問題,真正優化程式碼需要開發者更多的技術經驗。


小編微信:可加並拉入《QiShare技術交流群》。

iOS 常用除錯方法:靜態分析

關注我們的途徑有:
QiShare(簡書)
QiShare(掘金)
QiShare(知乎)
QiShare(GitHub)
QiShare(CocoaChina)
QiShare(StackOverflow)
QiShare(微信公眾號)

推薦文章:
iOS訊息轉發
iOS 自定義拖拽式控制元件:QiDragView
iOS 自定義卡片式控制元件:QiCardView
iOS Wireshark抓包
iOS Charles抓包
奇舞週刊

相關文章