Xcode執(zhí)行靜態(tài)代碼分析
在項(xiàng)目的開(kāi)發(fā)之中,每個(gè)開(kāi)發(fā)者最激動(dòng)最高興看到的是自己編寫(xiě)的代碼,不用太多的調(diào)試就可以暢通無(wú)阻的運(yùn)行,無(wú)任何bug侵襲。但這只是個(gè)理想的狀態(tài),看起 來(lái)運(yùn)行良好的代碼往往都會(huì)存在潛在位置的bug,這是每位開(kāi)發(fā)者最頭痛的事,也是每位開(kāi)發(fā)者都想極力避免的事情。所以如果手頭用到的IDE能夠比較給力的 話(huà),那么我們就可以避免程序中許多的bug。Xcode作為一款強(qiáng)大的Objective-C的IDE,其內(nèi)置提供了很多開(kāi)發(fā)工具來(lái)輔助開(kāi)發(fā)者的日常開(kāi)發(fā) 工作,最大限度的降低開(kāi)發(fā)難度,本篇簡(jiǎn)單介紹下Xcode中的靜態(tài)代碼分析功能。
靜態(tài)分析的主要目的:
代碼中的bug往往是由于開(kāi)發(fā)者忽略一些代碼缺陷而造成的,這些代碼缺陷可能是極其微小的錯(cuò)誤,以至于在程序的編譯期并未給出很好的錯(cuò)誤, 從而導(dǎo)致這些代碼缺陷在程序的運(yùn)行期以某種非正常形式呈現(xiàn)出來(lái)。那么對(duì)于開(kāi)發(fā)這開(kāi)說(shuō),這些微小的代碼缺陷,往往是很難跟蹤調(diào)試的,因此也為修復(fù)代碼帶來(lái)了 很大困難。Xcode靜態(tài)代碼分析的作用即發(fā)現(xiàn)項(xiàng)目源代碼中的某些代碼缺陷,并分類(lèi)進(jìn)行提示,以方便開(kāi)發(fā)者及時(shí)關(guān)注并加以修改,從而把代碼缺陷(潛在的 bug)及時(shí)清除。
靜態(tài)分析錯(cuò)誤提示分類(lèi):
Xocde的靜態(tài)代碼分析工具會(huì)接卸項(xiàng)目的源代碼,并以以下集中錯(cuò)誤類(lèi)型加以標(biāo)識(shí):
- 邏輯缺陷,例如訪(fǎng)問(wèn)未初始化的變量或空指針的解引用
 - 內(nèi)存管理缺陷,如內(nèi)存泄露
 - 無(wú)用存儲(chǔ)缺陷(永不會(huì)被訪(fǎng)問(wèn)的變量)
 - 因未遵從項(xiàng)目用到的框架(frameworks)或類(lèi)庫(kù)(libraries)所規(guī)范而導(dǎo)致的API使用缺陷
 
第一次在項(xiàng)目中執(zhí)行靜態(tài)分析時(shí),可能會(huì)發(fā)現(xiàn)許多錯(cuò)誤。但經(jīng)常性的執(zhí)行靜態(tài)分析并修復(fù)發(fā)現(xiàn)的代碼缺陷,之后的遇到的錯(cuò)誤會(huì)越來(lái)越少。這對(duì)于編寫(xiě)強(qiáng)壯的代碼是很有幫助的。
但要注意的是,靜態(tài)分析未報(bào)告錯(cuò)誤,并不意味者程序沒(méi)有錯(cuò)誤。靜態(tài)分析工具并不是萬(wàn)能的,不會(huì)檢測(cè)到源代碼中的所有錯(cuò)誤。
靜態(tài)代碼分析的使用舉例:
以新建StaticCodeAnalysisDemo功能為例。新建MJIssueViewController測(cè)試文件,并編寫(xiě)兩個(gè)會(huì)提示靜態(tài)分析錯(cuò)誤的測(cè)試方法,代碼如下:
- // Dead store
 - - (void)issueCodeBlockA
 - {
 - CGRect frame = CGRectMake(0.0, 0.0, 100, 100);
 - }
 - // Memory , Potential leak of an object
 - - (CGGradientRef)issueCodeBlockB
 - {
 - CGGradientRef gradient ;
 - CGColorSpaceRef colorSapce = CGColorSpaceCreateDeviceRGB() ;
 - CGFloat components[16] = {
 - 211/255.0 , 101/255.0 , 98/255.0 , 1.0 ,
 - 215/255.0 , 54/255.0 , 45/255.0 , 1.0 ,
 - 193/255.0 , 19/255.0 , 0 , 1.0
 - } ;
 - CGFloat locations[] = {0.0 , 0.5 , 1.0 } ;
 - int locationNum = 3 ;
 - gradient = CGGradientCreateWithColorComponents(colorSapce, components, locations, locationNum);
 - return gradient ;
 - }
 
長(zhǎng)按Xcode左上角的Run按鈕中,在彈出的下拉列表選擇Analyze,之后工程會(huì)進(jìn)行自動(dòng)進(jìn)行build,

在成功后,在左側(cè)欄的Issue Navigation一欄中,我們可以看到Xcode靜態(tài)分析工具為我們展示的一些錯(cuò)誤提示。如下圖:

此處包含了Dead Store和Memory錯(cuò)誤提示,Dead Store提示了在方法中不會(huì)被使用的變量frame ;Memory提示了潛在內(nèi)存泄露錯(cuò)誤(gradient變量未調(diào)用CGGradientRelease函數(shù)進(jìn)行釋放)。  
接著,點(diǎn)擊左側(cè)錯(cuò)誤導(dǎo)航中的提示之一,我們看到Xcode以一種圖形化的導(dǎo)向方式為我們指定錯(cuò)誤發(fā)生的流轉(zhuǎn)方式,第一次看覺(jué)得還是比較炫的。

這樣,按照靜態(tài)分析工具的錯(cuò)誤提示指引,我們可以預(yù)先發(fā)現(xiàn)那些代碼缺陷,及時(shí)進(jìn)行修復(fù),這樣代碼發(fā)生錯(cuò)誤的概率將明顯減少。
設(shè)置工程自動(dòng)進(jìn)行靜態(tài)分析  
選中工程文件,在TARGETS的Build Settings選項(xiàng)中的搜索欄中搜索關(guān)鍵字,Run Static  Analyzer,在結(jié)果中,Build Options下會(huì)顯示Run Static  Analyzer選項(xiàng)設(shè)置,雙擊該選項(xiàng)并在彈出窗口中將NO改為YES,

那么在下次工程直接運(yùn)行時(shí)會(huì)自動(dòng)進(jìn)行代碼靜態(tài)分析,并給出錯(cuò)誤提示。
注:描述于IOS5.1下















 
 
 






 
 
 
 