自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS故障排除指南:基本技巧

譯文
移動(dòng)開(kāi)發(fā) iOS 新聞
本文為《iOS故障排除指南:基本技巧》。通過(guò)閱讀本文,相信大家會(huì)對(duì)當(dāng)前最重要的iOS應(yīng)用程序調(diào)試方案以及如何利用最短時(shí)間搞定問(wèn)題擁有更加深刻的理解。我們的目的是盡可能縮短花費(fèi)在bug修復(fù)身上的時(shí)間,并把節(jié)省下來(lái)的精力與資源投入真正重要的應(yīng)用開(kāi)發(fā)工作中。

【2013年1月16日 51CTO外電頭條】本文為《iOS故障排除指南:基本技巧》。在iOS程序的數(shù)組中的三個(gè)對(duì)象莫名其妙成了五個(gè)、新開(kāi)發(fā)成員的加入令游戲性不升反降:熟悉應(yīng)用開(kāi)發(fā)的各位朋友對(duì)這些情況一定也不陌生,這時(shí)調(diào)試就成了撥亂反正、收拾舊山河的必需手段。通過(guò)閱讀本文,相信大家會(huì)對(duì)當(dāng)前最重要的調(diào)試方案以及如何利用最短時(shí)間搞定問(wèn)題擁有更加深刻的理解。

教程信息

  •  完成時(shí)間: 30 分鐘
  •  執(zhí)行難度: 中等
  •  相關(guān)技術(shù): iOS SDK

在本文中,我們的議題包括以下三點(diǎn):

  • 利用控制臺(tái)檢查應(yīng)用程序狀態(tài);
  • 進(jìn)行日志記錄并深入掌握NSLog操作方法;
  • 通過(guò)對(duì)象生命周期追蹤內(nèi)存使用情況。

利用控制臺(tái)進(jìn)行檢查

位于Xcode底端的這位仁兄稱得上我們調(diào)試工作中的***助手。輸出日志信息、錯(cuò)誤信息以及其它各類實(shí)用信息都是它的拿手絕活,這有助于我們一步步鎖定應(yīng)用錯(cuò)誤。除了直接閱讀來(lái)自日志記錄的輸出結(jié)果,大家還可以在流程中的任意環(huán)節(jié)暫停,進(jìn)而檢查應(yīng)用程序的各個(gè)部分。

條件斷點(diǎn)

首先我假設(shè)大家已經(jīng)了解存點(diǎn)的工作機(jī)制(如果還不了解也別擔(dān)心,看完這幾段內(nèi)容您也應(yīng)該基本掌握這部分知識(shí)了)。斷點(diǎn)的作用非常重要,它能夠幫我們查看應(yīng)用程序在給定時(shí)間點(diǎn)上的所在位置——但在對(duì)象達(dá)到特定值并觸發(fā)斷點(diǎn)之后,再通過(guò)單步調(diào)試循環(huán)或者遞歸函數(shù)的做法實(shí)在是個(gè)痛苦的過(guò)程。這里,我們推薦大家采用條件斷點(diǎn)。

條件斷點(diǎn),顧名思義是指只會(huì)在特定條件下觸發(fā)的斷點(diǎn)。設(shè)想一下,當(dāng)我們只希望斷點(diǎn)在某對(duì)象在特定狀態(tài)或者“第n次”循環(huán)更替時(shí)發(fā)生,條件斷點(diǎn)就成為大家的不二選擇。在Xcode編輯器中點(diǎn)擊“gutter”來(lái)在代碼中添加一個(gè)斷點(diǎn) ,右擊該斷點(diǎn)并選擇“edit breakpoint(編輯斷點(diǎn))”為其設(shè)置特殊條件。

大家可以設(shè)置條件(例如i==12)或者設(shè)定循環(huán)中斷點(diǎn)被忽略的次數(shù)。當(dāng)然,我們也可以采取其它一些自動(dòng)觸發(fā)機(jī)制,例如在調(diào)試命令輸出值時(shí)啟用斷點(diǎn)。

  提示: 利用快捷鍵組合coomand+\能夠快速添加或刪除斷點(diǎn)。

另一項(xiàng)值得關(guān)注的斷點(diǎn)技巧是添加“exception breakpoint(異常斷點(diǎn))”。不知道大家有沒(méi)有注意到,當(dāng)我們遇到異常情況時(shí),Xcode會(huì)有99%的機(jī)率將我們引向主方法中的自動(dòng)釋放池。

感謝Xocde……你可真會(huì)幫倒忙。

通過(guò)設(shè)定異常斷點(diǎn),我們就能夠精確定位引發(fā)異常情況的代碼行。要做到這一點(diǎn),首先得打開(kāi)異常斷點(diǎn)選項(xiàng)卡(快捷鍵為command+6)。在窗口底部會(huì)出現(xiàn)一個(gè)“+”按鈕,點(diǎn)選該按鈕即可添加“異常斷點(diǎn)”?,F(xiàn)在,一旦Xcode在運(yùn)行中遭遇異常,即會(huì)在引發(fā)問(wèn)題的代碼處中斷。

在控制臺(tái)端實(shí)現(xiàn)手動(dòng)輸出

如果我們?cè)趹?yīng)用的特定點(diǎn)進(jìn)行中斷,一般來(lái)說(shuō)是為了檢查對(duì)象的當(dāng)前狀態(tài)。Xcode為我們提供了一套“variables view(變量視圖)”,該視圖位于Xcode底部、與控制臺(tái)相鄰。理論上講它的作用是顯示與當(dāng)前環(huán)境相關(guān)的所有值的實(shí)時(shí)狀態(tài)。但在實(shí)踐中,這一作用有時(shí)無(wú)法正常生效。或者是無(wú)法列出值,或者是并有將值更新為中斷時(shí)的***狀態(tài),總之問(wèn)題不少。

幸運(yùn)的是,我們可以利用一些非常實(shí)用的控制臺(tái)命令自己進(jìn)行對(duì)象檢查工作。在控制臺(tái)中輸入“po”來(lái)獲取特定對(duì)象的當(dāng)前細(xì)節(jié)信息(我們使用‘p’來(lái)處理純量值)。

這種方式在檢查某對(duì)象是否已經(jīng)存在(如果對(duì)象不存在則輸出結(jié)果為nil)、確定對(duì)象值、查詢某數(shù)組/字典在當(dāng)前運(yùn)行狀態(tài)下的內(nèi)容以及對(duì)兩個(gè)對(duì)象進(jìn)行比較等方面效果拔群。由于這條命令會(huì)輸出相關(guān)對(duì)象的內(nèi)存地址,因此我們可以對(duì)本應(yīng)相同的兩個(gè)對(duì)象進(jìn)行輸出,查看二者是否正確擁有相同的內(nèi)存地址。

另一條實(shí)用但卻常常被忽視的命令則是recursiveDescription,我們可以用它輕松檢查視圖。運(yùn)行該命令后,系統(tǒng)會(huì)將視圖結(jié)構(gòu)作為結(jié)果輸出。

有效日志記錄

在調(diào)試程序的過(guò)程中,大家常常希望能將特定消息記錄到控制臺(tái)中。而“NSLog”函數(shù)允許用戶將任何想要的結(jié)果輸出至控制臺(tái)。對(duì)于希望以特定途徑梳理應(yīng)用程序或者無(wú)法根據(jù)特定情況一一設(shè)定斷點(diǎn)卻仍然想要進(jìn)行值比較的用戶而言,它的作用相當(dāng)重要。NSLog的使用格式與[NSString StringWithFormat]相同(如下圖所示)。

  提示: 大家可以訪問(wèn)https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/FormatStrings.html了解更多Objictive-C中的格式化字符知識(shí)。

 

聰明地使用NSLog

盡管NSLog自身功能已經(jīng)可圈可點(diǎn),但我們還得在實(shí)際應(yīng)用中再動(dòng)動(dòng)腦子。任何由NSLog輸出的內(nèi)容都會(huì)成為成品代碼的一部分,也就是說(shuō)會(huì)被任何接觸到應(yīng)用的人看到。只要把設(shè)備接入信息管理工具,每個(gè)人都能查看控制臺(tái)信息并查詢每一條日志記錄。沒(méi)錯(cuò),這必然會(huì)引發(fā)一系列嚴(yán)重后果。試想一下,如果我們?cè)?jīng)向控制臺(tái)輸出過(guò)機(jī)密邏輯算法或者者用戶密碼,這些信息一旦被他人獲得將帶來(lái)惡劣影響。有鑒于此,蘋果公司會(huì)在App Store的審核流程中檢測(cè)控制臺(tái)信息。一旦發(fā)現(xiàn)其中包含太多輸出結(jié)果,應(yīng)用程序?qū)⒈恢苯哟蚧亻_(kāi)發(fā)者處進(jìn)行調(diào)整。

幸運(yùn)的是,我們還有更好的辦法實(shí)現(xiàn)日志記錄工作。根據(jù)大家精力與時(shí)間的富裕程度,我們擁有幾種不同的處理方案。最簡(jiǎn)單的辦法是做一個(gè)宏,其中只包含調(diào)試版本中的NSLog。如果時(shí)間充實(shí),也可以采用全局可訪問(wèn)的頭文件;我們可以把所有日志記錄都灌進(jìn)去,而且不用擔(dān)心它們會(huì)出現(xiàn)在成品代碼當(dāng)中(前提是我們沒(méi)有對(duì)預(yù)設(shè)的默認(rèn)宏值做出改動(dòng)——看不懂也沒(méi)關(guān)系,直接用就好)。

  1. #ifdef DEBUG 
  2.  
  3. #define DMLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) 
  4.  
  5. #else 
  6.  
  7. #define DMLog(...) do { } while (0) 

 現(xiàn)在如果我們使用DMLog(這個(gè)名稱可以隨便起),它將只向調(diào)試版本輸出結(jié)果,任何成品代碼都不會(huì)受到影響。_PRETTY_FUNCTION_也幫上了大忙,它會(huì)根據(jù)日志信息來(lái)源為函數(shù)命名。

采取下一個(gè)步驟

雖然NSLog表現(xiàn)卓越,但其局限性也不可忽視:

  • 它只能向本地輸出結(jié)果;
  • 我們無(wú)法為其添加日志“等級(jí)”(例如嚴(yán)重、警告等等);
  • NSLog速度很慢。在進(jìn)行大量處理時(shí)它會(huì)嚴(yán)重拖慢應(yīng)用程序的運(yùn)行效果。

對(duì)于想給自己來(lái)點(diǎn)挑戰(zhàn)的開(kāi)發(fā)者來(lái)說(shuō),還有兩款框架能夠回避NSLog的短板——但前輩是大家得有足夠的時(shí)間和精力投入其中。下面來(lái)看這兩款個(gè)人推薦:

  • Cocoa LumberJack –一款專為Cocoa打造的知名通用型日志框架,學(xué)習(xí)起來(lái)略困難但功能非常強(qiáng)大。
  • SNLog –NSLog的替換方案之一。
關(guān)注對(duì)象的生命周期

盡管自動(dòng)引用計(jì)數(shù)(簡(jiǎn)稱ARC)的出現(xiàn)令內(nèi)存管理工作不再成為時(shí)間殺手,但在對(duì)象的生命周期中追蹤重要事件仍然非常關(guān)鍵。畢竟ARC并沒(méi)能消除內(nèi)存泄漏或者嘗試訪問(wèn)已釋放對(duì)象的可能性(它的介入反而使二者的控制工作更加艱難)。為此,我們可以通過(guò)一系列流程及工具實(shí)現(xiàn)對(duì)象當(dāng)前狀態(tài)的監(jiān)控工作。

記錄重要事件

在Objective-C的對(duì)象生命周期中,最重要的兩個(gè)方法分別是init與dealloc。將二者的事件記錄納入控制臺(tái)非常關(guān)鍵,這樣我們就可以從啟用時(shí)開(kāi)始全程監(jiān)控對(duì)象,并確保其在必要時(shí)正確結(jié)束。

  1. - (id)init 
  2.  
  3.  
  4.     self = [super init]; 
  5.  
  6.     if (self) 
  7.  
  8.     { 
  9.  
  10.         NSLog(@"%@: %@", NSStringFromSelector(_cmd), self); 
  11.  
  12.     } 
  13.  
  14.     return self; 
  15.  
  16.  
  17. - (void)dealloc 
  18.  
  19.  
  20.     NSLog(@"%@: %@", NSStringFromSelector(_cmd), self); 
  21.  

雖然輸入上述代碼的過(guò)程令人煩躁,但我們有辦法利用自動(dòng)化機(jī)制使這項(xiàng)工作變得更輕松。我敢保證當(dāng)大家的應(yīng)用程序運(yùn)行出現(xiàn)異常時(shí),它將起到至關(guān)重要的提示作用。大家還可以在其中使用日志片段方面的小技巧,這樣結(jié)果就不會(huì)被輸出到成品代碼當(dāng)中(甚至為我們創(chuàng)建一套宏)。

靜分析器與檢查器

Xcode中提供的兩款工具能夠成為我們清理代碼、降低代碼出錯(cuò)機(jī)率的好幫手。靜態(tài)分析器(Static Analyzer)工具會(huì)揪出釋放對(duì)象中那些未被實(shí)際使用的對(duì)象(ARC在Core Foundation對(duì)象方面無(wú)法實(shí)現(xiàn)這一功能),進(jìn)而達(dá)到改善代碼的目標(biāo)。要讓它伸出援手,只要在Product中選擇“Anlayze”即可。

檢查器(Inspector)同樣是一款強(qiáng)大的工具,允許我們密切檢測(cè)應(yīng)用程序各方面的內(nèi)存使用、文件系統(tǒng)活動(dòng)等情況;它甚至還能自動(dòng)模擬UI交互操作。要讓它伸出援手,我們只需在Product下拉菜單中選擇“Profile”選項(xiàng)即可。

點(diǎn)選之后會(huì)打開(kāi)一個(gè)工具窗口,我們可以從中選擇一套配置模板加以運(yùn)行。最常見(jiàn)的選擇是zombies(僵尸,這一點(diǎn)我們稍后再詳述)、activity monitor(活動(dòng)監(jiān)控)以及l(fā)eaks(泄露)三種。泄露方案的作用非常直觀——幫助我們追蹤應(yīng)用程序運(yùn)行中可能出現(xiàn)的任何內(nèi)存泄露情況。

“僵尸”也是好朋友

雖然在ARC坐鎮(zhèn)的情況下可怕的EXC_BAD_ACCESS錯(cuò)誤的出現(xiàn)機(jī)率已經(jīng)大大降低,但在某些極端情況下它仍然有發(fā)生的可能。在處理UIPopoverController或者核心基礎(chǔ)對(duì)象時(shí),我們?nèi)匀荒軌驅(qū)^(guò)度釋放的對(duì)象發(fā)起訪問(wèn)。通常情況下,一旦內(nèi)存中的對(duì)象被釋放,其只能就此消失。但當(dāng)“僵尸”方案啟動(dòng)時(shí),該對(duì)象只會(huì)被標(biāo)記為“釋放”但卻仍然被保留在內(nèi)存當(dāng)中。如此一來(lái),當(dāng)我們?cè)L問(wèn)某個(gè)僵尸對(duì)象時(shí),Xcode會(huì)提醒我們?cè)搶?duì)象雖然能夠被訪問(wèn)、但在實(shí)際環(huán)境中已經(jīng)不應(yīng)存在。在這種模式下,我們將能夠了解到正常情況下無(wú)法獲得的實(shí)時(shí)狀態(tài)與對(duì)象位置。

我們可以通過(guò)兩種方法啟用僵尸對(duì)象,即在檢查器中運(yùn)行“僵尸”配置模板還有在“Run”選項(xiàng)中選擇僵尸診斷方案。點(diǎn)擊停止按鈕旁邊的方案名稱,然后點(diǎn)選“Edit Scheme(編輯方案)”、單擊診斷選項(xiàng)卡并選擇“Enable Zombie Objects(啟用僵尸對(duì)象)”。請(qǐng)注意,僵尸模式下的調(diào)試工作只能在模擬器中實(shí)現(xiàn),我們無(wú)法在物理設(shè)備上完成這一診斷流程。

綜述

希望本文能夠幫助大家在應(yīng)用程序調(diào)試工作方面拓展思路,我們的目的是盡可能縮短花費(fèi)在bug修復(fù)身上的時(shí)間,并把節(jié)省下來(lái)的精力與資源投入真正重要的應(yīng)用開(kāi)發(fā)工作中。

當(dāng)然,我們無(wú)法列出所有值得關(guān)注的技術(shù)或工具。還有很多其它方案需要留意,例如產(chǎn)品調(diào)試、遠(yuǎn)程bug報(bào)告、崩潰報(bào)告等等。大家在工作中有哪些心得想與我們分享?對(duì)于以上內(nèi)容又有哪些疑問(wèn)?請(qǐng)?jiān)谠u(píng)論欄中與我們交流。

祝各位編程愉快!

原文鏈接:http://mobile.tutsplus.com/tutorials/iphone/debugging-in-ios-essential-tips/

原文標(biāo)題:Debugging in iOS – Essential Tips

 

責(zé)任編輯:佚名 來(lái)源: 51CTO.com
相關(guān)推薦

2013-08-26 14:18:12

SELinux

2020-03-04 14:50:38

Linux硬件故障

2020-03-03 10:47:47

LinuxSystemdDocker

2024-09-24 13:11:18

2010-01-06 09:56:22

2009-11-17 17:29:59

CISCO路由器故障排

2010-04-19 21:25:33

IOS軟件

2010-08-06 10:57:52

思科路由器IOS軟件故障

2010-08-24 13:55:09

思科故障排除

2009-12-22 16:09:09

2023-08-31 16:43:46

軟件開(kāi)發(fā)調(diào)試

2011-05-06 15:22:19

打印機(jī)故障排除

2023-07-26 15:46:52

Docker管理容器

2010-08-26 10:10:18

寬帶路由器

2011-02-21 15:48:19

2011-05-10 09:54:13

打印機(jī)故障排除

2011-05-04 11:26:17

打印機(jī)故障排除惠普

2011-04-27 13:56:18

HP LaserJet打印機(jī)故障排除

2011-08-10 14:03:53

2011-04-27 14:04:16

打印機(jī)故障
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)