xcode 代碼調試與快捷鍵 代碼塊

爲何你的數組包含3個項目而不是5個?爲何你的遊戲運行緩慢?這些都跟調試有關,調試是開發過程當中必不可少的一部分。本文所列舉了一些重要的調試功能(固然並不全面)能夠幫你用更少的時間來解決bug問題。html

 
本文內容主要包括3個方面:
使用console檢查app狀態
進行日誌記錄,並熟練的駕馭NSLog
使用對象的生命週期來跟蹤內存的使用。
 
使用Console檢查app狀態
Xcode底部的小黑盒是咱們調試時的好朋友,它能夠輸出日誌信息、錯誤信息以及其餘有用的東西來幫你跟蹤錯誤,除了能夠看到日誌直接輸出的信息外,咱們編程過程當中也能夠在某些斷點停留,來檢查app的多個方面。
 
條件斷點
我假定你知道Breakpoints是如何工做的(若是你不知道,呵呵,看完這個文章也許你就知道了!)
 
讓程序在某個特定的時間點命中斷點很是有價值,但要經過一個循環或者遞歸函數才能讓對象等於某個肯定的值,是一件使人痛苦的事情。這時候咱們可使用條件斷點!
 
條件斷點就是帶有條件表達式的斷點,只有知足這個條件,程序纔會暫停。假想咱們只想在對象處於特定狀態的時候斷點,或者在第N次迭代循環時命中斷點。
 
點擊Xcode editor的‘gutter’來添加斷點,右鍵點擊斷點,而後選擇「edit breakpoint」來設置特定條件。
 
 
條件斷點只有在遇到特定狀況時纔會中斷,你能夠提供給一個條件(好比i == 12),或者斷點應該忽略的次數。另外,你還能夠添加能根據斷點自動發生的動做,例如一個debugger command---打印一個值。
 
提示:添加/刪除斷點的鍵盤快捷鍵是command+\
 
另一個重要的斷點技巧是添加一個異常斷點(exception breakpoint)。當遇到異常時, Xcode基本上都會自動轉到main方法的autorelease pool中。
 
經過設置異常斷點,你能夠定位到引發異常斷點的具體代碼行。
 
如何添加異常斷點?
 
1.打開異常斷點tab(command+6);2.選擇窗口左下角的」+」按鈕;3.選擇按鈕並添加‘exception breakpoint’。
 
這樣,當Xcode遇到異常狀況時,將會在引發異常代碼的地方發生斷點。
 
從Console進行手動打印
理論上說,它會展現當前環境中全部值的狀態;實際上,有時候會出現bug,而且不會列出值或者當你單步調試的時候不進行更新。
 
通常狀況下,咱們在app代碼中添加特定斷點,是爲了經過Xcode提供的‘variables view’(該view在Xcode底部console旁邊)來查看對象的狀態 。理論上說,它能夠顯示出與當前上下文相關的全部值的狀態。實際上,有時候會有點小問題,不會列出相關的值或者不會進行相關的更新。
 
不過,咱們可使用一些有用的console命令來檢查特定的對象。在console中輸入‘po’就能夠得到某個斷點的即時信息。(處理scalar值時,咱們可使用‘p’)
 
在咱們查看一個已存在的對象時,這一點很是有用(若是對象不存在的話會打印出nil),肯定對象的值,找出數組/字典運行時的信息,甚至是比較兩個對象。由於這個指令打印出相關對象的內存地址,因此你能夠打印你認爲應該同樣的兩個對象,看看它們的內存地址是否相同。
另外一個有用的,可是被隱藏的指令是recursiveDescription,你能夠簡單地用它對view進行檢查。
在view中調用recursiveDescription來打印它的繼承關係。
 
 
有效的Logging
有時,在調試程序的某個特定時間,咱們但願將消息打印到控制檯,此時‘NSLog’函數容許咱們將任意輸出打印至console。
 
此時可使用NSLog函數,經過該函數能夠將任意的輸出打印到控制檯。在不使用斷點時,這個功能很是有用。NSLog聽從的格式與[NSString StringWithFormat]方法聽從的格式同樣。(你能夠從下邊的截圖中看到)
 
 Tip: 這裏能夠看到蘋果關於Objective-C中字符串格式化的信息:  String Programming Guide
 
NSLog 
NSLog很是有用,咱們須要聰明地實現它。從NSLog打印出的任何東西都會變成代碼,任何人均可以看見。將設備鏈接到電腦,打開XCode中的organiser,就能夠從console查看到每條日誌信息,這會帶來很大的影響。想一下,你想把一些保密的算法邏輯或者用戶密碼打印到console。正由於這個,若是蘋果發如今production build中,有太多內容輸出到console,那麼你的應用可能會遭到蘋果的拒絕。
 
 
幸運的是,這裏有一個最簡單的辦法進行log——經過一個宏,讓NSLog只在debug build的時候起做用。將這個功能添加到全局都能訪問獲得的頭文件中。這樣你就能夠盡情的使用log了,而且當進行production時,不會包含log相關代碼。以下代碼:
 
1.#ifdef DEBUG
2.#define DMLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
3.#else
4.#define DMLog(...) do { } while (0)
 
若是你使用DMLog,那麼它只能在debug build期間打印。__PRETTY_FUNCTION__ 也能夠幫忙打印出log所在的函數的名稱。
 
下一步
NSLog 很強大,但也有很多限制:
1. 只能本地打印
2. 不支持分級別的log(好比是危險仍是警告)
3. NSLog很是慢,大量處理時會明顯下降程序的運行效率。
 
推薦兩個框架,能夠避免NSLog一些限制:
Cocoa LumberJack –衆所周知的通用的Cocoa日誌框架之一,學習起來有點難度,可是很是強大。
SNLog –NSLog的替代品。
 
跟蹤對象的生命週期
儘管Automatic Reference Counting (ARC)已經讓內存管理變得簡單、省時和高效,可是在object的life-cycles中跟蹤一些重要事件依然十分重要。畢竟ARC並無徹底排除內存泄露的可能性,或者試圖訪問一個被release的對象。爲了這個目的,咱們能夠用一些處理方法和工具來幫助咱們盯着對象正在作些什麼。
 
LOG重要事件
Objective-C 對象的 life-cycle中有兩個很重要的方法: init 和dealloc ,將這兩個方法調用的事件log到console是不錯的選擇——你能夠經過控制檯觀察到對象生命的開始,更重要的是,能夠確保對象的釋放。
1.- (id)init
2.{
3.    self = [super init];
4.    if (self)
5.    {
6.        NSLog(@"%@: %@", NSStringFromSelector(_cmd), self);
7.    }
8.    return self;
9.}
10.- (void)dealloc
11.{
12.    NSLog(@"%@: %@", NSStringFromSelector(_cmd), self);
13.}
 
 
靜態分析器和Inspector(檢查器)
Xcode中還有兩個工具能夠幫咱們清理代碼,減小代碼出錯的概率。對Xcode而言,靜態分析器工具是一個很是棒用來改善代碼的工具。好比檢測出沒有使用過的對象,沒有release對象(針對Core Foundation對象,ARC仍然會有這樣的問題)。經過選擇Product菜單中的‘Anlayze’能夠查看到相關建議。
 
 
檢查器是很是強大的一組工具,經過檢查器不只能夠從不一樣的角度檢查程序對內存的使用狀況,文件系統的使用狀況(增長、刪除、修改等),甚至還提供了自動UI交互的方法。經過選擇Product菜單中的‘Profile’能夠查看到這些檢查器。
選擇‘Profile’會打開一個Instrument窗口,這裏能夠選擇一個配置模板進行運行。最經常使用的模板有zombies(稍後會討論),activity monitor和leaks。在程序運行時,對內存泄露進行捕捉時,Leaks多是最有用的一個模板。
 
  Zombies是你的朋友
雖然在有ARC的地方很難再遇到讓人難受的EXC_BAD_ACCESS錯誤了,可是在某些肯定的狀況下,該錯誤仍是會發生的。當在處理UIPopoverController或者core foundation對象時,咱們能夠訪問一個已經被release掉的對象。通常,當咱們release內存中的一個對象時,該對象將被銷燬。可是,當Zombies開啓時,只是將對象標記爲release,實際上該對象還停留在內存中。當咱們訪問一個Zombie對象時,Xcode能夠告訴咱們正在訪問的對象是一個不該該存在的對象了。由於Xcode知道這個對象是什麼,因此可讓咱們知道這個對象在哪裏,以及這是何時發生的。
 
這裏有兩種方法能夠查找出Zombies對象。使用檢查器中的Zombie配置模板,或者在‘Run’ build選項中開啓Zombie診斷選項。在Stop按鈕的旁邊,點擊scheme名稱,而後選擇‘Edit Scheme’,點擊diagnostic tab項,並勾選上‘Enable Zombie Objects’。注意,Zombie只能用在模擬器調試中,真機上不能使用。
 
注意,Zombie模式調試僅適用於模擬器,不能在真實設備上使用。
 
 
總結
但願以上內容能給你幫你更高效地調試你的app,全部這些都是爲了能都節省bug修復時間,這樣開發者就能把時間花在更重要的事情上,或者打造一款偉大的應用程序。
 
上邊列出的確定不是一個全面的列表,還有不少咱們沒有討論的方法,好比遠程遙控bug報告,崩潰報告以及更多。也但願你能分享更多。
 
 
xcode默認快捷鍵
 

Run->Run(Command+R)
Run->Go、Run->Debug(Command+Y)git

command+Z+P 繼續(調試器中)github

command+Z+O 跳過算法

command+Z+I 跳入編程

command+Z+T 跳出數組

自定義:xcode

選擇Xcode->Preferences->Key Bindings 調試位F5-F9
相關文章
相關標籤/搜索