第7章 深入瞭解Xcode
Xcode是一個很好用的工具,有很多強大的功能,不過並不是所有的功能都易於發現。如果你打算長期使用這個強大的工具,就肯定要儘可能多瞭解它。本章將介紹一些Xcode編輯器的使用技巧,這對於編寫和瀏覽程式碼以及查詢資訊都是大有幫助的。此外,還會提到一些用Xcode除錯程式的方法。

這裡介紹的是Xcode4.3.2,也就是寫這本書時的最新版本。蘋果公司熱衷於在Xcode版本升級時新增或刪除一些東西。(默然說話:目前我用的是4.6.2,不知道有多少是一樣的)

窗口布局一覽

工具欄:位程式視窗的最頂端,上面有很多工具按鈕。

導航器面板:位於視窗左邊,通常用來顯示專案中的檔案列表,也可以瀏覽其他內容,比如符號(symbol)、搜尋(Search)、問題(Issue)、除錯(Debug)、斷點(Breakpoints)和日誌(Logs)。可以按住Command鍵和一個數字鍵(從1到7)或點選面板頂端的圖示來切換檢視。

編輯器面板:位於中間偏右的位置。你大部分時間都要在這裡大展身手,寫下一行行原始碼,改變世界,飛黃騰達。

檢查器面板:位於視窗右邊,顯示的是與上下文(當前選中的內容)有關的資訊,以及修改選中項屬性值的按鈕。

偵錯程式面板:位於底部居中位置。偵錯程式執行的時候,堆疊和偵錯程式控制器會出現在這裡。

庫面板:隱藏在視窗右下角,列有專案資源、物件、程式碼片段和其他的專案中可能會用到的東西。

改變公司名稱

Xcode在註釋塊中寫入了檔名稱、專案名稱以及建立者和建立時間,包含這些資訊是為了讓你一眼看去便知道所檢視的是哪個檔案,誰建立了它,以及它的生成時間。

更改公司名稱的方法很簡單。在導航器面板選中專案,並確保在編譯器面板的Project欄目下選中專案名稱。仔細觀察右邊的檢查器面板,在Project Document欄目下你將會看到Organization文字框。在裡面輸入你的公司名稱。

使用編輯器的技巧

Xcode提供了幾種組織專案和原始碼編輯器的基本方式。我們已經介紹了預設介面,它主要是用來管理實時專案和執行編碼任務的一體化視窗,編輯器面板則是用來顯示原始檔的,內容由視窗左邊導航器面板選中的原始檔而定。

這裡再稍微詳細講解一下你在導航器面板中所看到的內容。檔案列表展示了專案中所有有用的部分:原始檔、連結的框架和構建程式的Products資料夾。你還可以找到其他實用工具,比如訪問原始碼版本控制,所有的專案符號,還有智慧資料夾。

選中了某個檔案後,你會在視窗頂端的工具欄下面看到檔案的路徑,告訴你檔案在專案中的位置。你可以使用導航器面板底部的搜尋框來過濾列表檔案。

瀏覽器列出了每個名稱中帶字元car的原始檔。你可以在瀏覽器中選中它們使編輯器顯示它們的內容。因為大型專案可能擁有一百多個原始檔,所以如果檔案特別多的話,瀏覽器是一種很方便的管理工具。本章後面會深入介紹原始檔導航的相關話題。

編寫程式碼時,可以隱藏瀏覽器,這樣螢幕的可用面積會更大一些。在視窗的右上方有一組標記為View的工具欄按鈕。其中有三個按鈕,你可以把滑鼠懸停在上面來檢視其作用,不過,還是在這裡跟你直說吧:左邊的按鈕用來隱藏或顯示 導航器面板,你也可以使用Command+0快捷鍵來呼叫它;中間的開關按鈕負責偵錯程式區域是否可見;右邊的按鈕負責檢查器面板是否可見。

用獨立的視窗來顯示各自的原始檔也是有用的,尤其是當你想比較兩個不同檔案的時候。在導航器面板中雙擊原始檔就可以在新視窗中開啟它。你也可以在兩個不同的視窗中顯示 同一個檔案,不過要注意有時這兩個視窗會出現內容不同步的情況,因此你需要點選其中某個視窗來使它們同步。

你可能更傾向於使用標籤(就像在Safari中那樣)而不是多視窗的顯示方式。Xcode已經料到了。就好像Xcode使用者都瞭解Safari使用者似的。如果想要顯示標籤,請選擇View->Show Tab Bar選項。如果想要新增標籤,就點選標籤欄右邊的加號按鈕。

在Xcode的幫助下編寫程式碼

許多程式設計師都夜以繼日地寫程式碼。Xcode給所有程式設計師提供了一些功能,使編寫程式碼變得更容易,也更有趣。

首行縮排

有時,對程式碼進行大量的編輯會使其變得混亂不堪,Xcode可以改善這種狀況。選中文字後,按住Control鍵點選就能看到編輯器的上下文選單,之後選擇Structure-->Re-Indent選項,Xcode將會重新整理好一切。你可以使用快捷鍵Control+I來達到同樣的效果。

按下Command+[或Command+]鍵可以將選定的程式碼進行左移或右移。如果你想按照自己的風格來調整Xcode內的程式碼,主要技巧見Xcode》Preferences》Text Editing》Indentation。

程式碼自動完成

Xcode會在你輸入程式碼的過程中給出建議,這就是Xcode的程式碼提示功能,通常叫做程式碼自動完成。編寫程式時,Xcode會為所有內容生成索引,包括專案中的變數名和方法名及匯入的框架。它知道區域性變數的名稱及其型別,甚至可能知道你的編碼風格是好還是壞。通過按下tab鍵來接受Xcode給我們的提示。如果你想關閉提示列表,按esc鍵就可以了,再按esc又會重新開啟自動完成列表。

把滑鼠懸停在方法名稱上,便會看到視窗右邊有一個問號圖示,點選它就會開啟一個描述方法資訊的迷你幫助視窗。

括號配對

輸入程式程式碼時,也許你會發現輸入某些字元(比如“)”、“]”、“}”)後螢幕會閃爍。如果發生了這種情況,就是Xcode在告訴你這個閉括號所對應的開括號在哪裡,我們在第二行末尾輸入了一個右括號,完成後前方相應的左括號就會以背景色短暫閃爍一下。

這個功能有時被稱為“括號配對”,它能在你結束一系列複雜的分隔符(也就是括號)集時提供幫助。要保證你輸入的每個閉括號都和你想關閉的開括號相互匹配。如果你弄錯了,Xcode會發出警報,而且也無法顯示與之匹配的開括號。

也可以雙擊某個分隔符,Xcode會選定它以及與它匹配的括號之間的全部程式碼。

批量編輯

有時,你可能想要將程式碼中的革相似更改應用到其他幾個地方,但是又不想自己逐個編輯。手動去做大量相似的編輯操作是件危險的事情,因為人類不擅長重複枯燥的工作。所幸,計算機很勝任這類工作。

在這方面對我們有所幫助的第一個Xcode功能並不是去操作程式碼,而是要建立一個安全網。選擇File》Create Snapshot...或按Command+Control+S,Xcode會記住專案當前的狀態,現在你就可以放心地編輯原始檔了,甚至可以隨心所欲地用各種方式“玩壞”你的專案。如果你意識到自己犯了一個很嚴重的錯誤,可以通過File》Restore Snapshot...選項開啟快照視窗,這樣就可以用前一個快照恢復專案了。在你做任何冒險的事情之前最好先建立一個快照。

之後自然就是查詢/替換了(默然說話:什麼?你從來沒用過查詢/替換?!好吧。。。我為你冤死的腦細胞及浪費的青春致以最誠懇的默哀)。Edit》Find子選單包含幾個非常方便的選項。選擇Find in Workspace(Command+Shift+F),或者在導航器中選擇搜尋選項,就可以對整個專案中的所有檔案進行內容搜尋或替換了。

這個查詢和替換的功能並不好用。如果你只是想重新命名函式的中的變數,它有可能會做多餘的操作(比如把別處的同名變數一起給改了)。它還沒有辦法更改原始檔的名稱。

Xcode有兩個功能可以彌補這些不足。第一個功能我們稱為Edit all in Scope。你可以選定一個符號,如區域性變數或引數,然後點選它,就會看到右邊出現了一個向下的箭頭(默然說話:我發現這個向下的箭頭有點難出來,似乎是先把游標點到區域性變數或引數上,然後對應的變數或引數都會出現一個虛線框,在虛線框上輕移一下滑鼠,向下箭頭就出現了)。點選箭頭就會看到一個選單,選擇Edit all in Scope選項。之後你輸入內容就會使所有該符號出現的地方同時更新。輸入完畢之後,只要在原始檔編輯視窗中單擊其他地方,就會退出Edit all in Scope模式。

Xcode中有一些內建的重構工具,其中就有一個能夠讓你輕鬆地重新命名類。它不僅能夠重新命名類,還能做一些諸如重新命名相應原始檔之類的漂亮活兒。而且如果你開發 的是GUI程式,它還能夠深入到nib檔案進行修改操作(默然說話:看不懂?據說後續章節會繼續介紹,請耐心等待)。

讓我們試著將所有的Car類名稱替換成Automobile類吧。請在編輯器中開啟Car.h檔案,並把游標放在類名Car中。選擇Edit》Refactor》Rename...選項,會顯示一個小小的對話方塊,在裡面填寫類名,並點Preview按鈕之後,Xcode就會把要做的任務顯示出來。它會列出所有可能會被改動的檔案及它們改動的地方。

確認這些更改沒問題之後,請點選Save按鈕。如果你是第一次重構,那Xcode會詢問你是否要啟用自動快照備份。選擇enable是一個明智的決定,這樣每一次重構之前,Xcode都會為你做一個快照,雖然會增加記憶體,但如果你對修改不滿意,要撤銷就會是很容易的一件事情了。

較為可惜的一件事情是重構並不能重新命名註釋中的文字。所以,類裡面的註釋、Xcode生成的檔案頭註釋或者任何你編寫的文件註釋都需要手工編輯。你可以使用查詢和替換功能來簡化這一過程。

程式碼導航

大多數原始檔的生命週期都大同小異,建立後很快就被寫入大量程式碼來實現各種功能,接下來進入增增改改的階段,然後進入維護階段。你必須先閱讀大量檔案才能新增或者修改程式碼。最後,當類編寫成熟後,你要在應用之前瀏覽其程式碼來了解它是如何工作的。本節主要介紹在程式碼的生命週期中瀏覽程式碼的不同方法。

1.emacs

emacs是一個很早就有的文字編輯器,它誕生於20世紀70年代,可以在現代的Mac作業系統上執行。這裡簡要介紹一些它的快捷鍵組合及其含義。

這是一些不用把手從鍵盤上拿開就能在文字中移動游標的快捷鍵。這些快捷鍵可以在Mac下面的各種軟體中使用。

control-F:游標前移一格

control-B:游標後移一格

control-P:游標上移一行

control-N:游標下移一行

control-A:游標移動到段落的頭部

control-E:游標移動到段落的尾部

control-T:交換游標兩邊的字元

control-D:刪除游標右邊的字元

control-K:將當前行游標以後的所有字元全部刪除,便於你重寫行尾的程式碼

control-L:將游標置於視窗正中央。如果你找不到游標位置或者想要移動視窗使游標快速定位於正中央,這個快捷鍵會非常好用。

2.快速開啟的竅門

假如你在瀏覽某個原始檔時,看到了檔案上方的#import語句,只要選定檔名(甚至可以不用選擇.h),然後選擇File》Open Quickly選項,Xcode就會為你開啟這個標頭檔案。

如果你沒有選擇任何文字,那麼選擇Open Quickly選項將會開啟一個對話方塊,這是另一種檔案查詢方法,你也可以使用快捷鍵Command+Shift+D來執行Open Quickly命令。這個對話方塊是個非常簡單的視窗,只有一個搜尋域和一個表格,但卻是非常快捷的專案內容搜尋方式。

如果你的顯示器很大,就可以在主編輯器旁邊使用輔助視窗(View》Assistant Editor》Show Assistant Editor)。預設情況下,如果一個面板顯示的是標頭檔案,那麼另一個面板顯示的就一定是實現檔案,不過你也可以根據自己的喜好更改這個設定。點選工具欄的Counterparts選單可以看到其他選項。

集中精力

你可能已經注意到緊挨著原始碼左側的兩個空欄。左邊較寬的那欄叫做邊欄,我們會在之後討論除錯的時候談到它。較窄的一欄叫做聚焦欄,顧名思議,聚焦欄能夠讓你將注意力集中在程式碼中某個部分。

注意聚焦欄的灰度,程式碼巢狀得越深,它旁邊的聚焦欄中的灰色也會越深。這種顏色編碼能夠使程式碼的複雜程式一目瞭然。你可以在聚焦欄的不同灰色區域懸停滑鼠來高亮顯示相應的程式碼片段。

你也可以點選聚焦欄來摺疊相應的程式碼片段。

使用導航條

在程式碼編輯器的頂部有一個小控制元件條,也就是導航條。這裡面的很多控制元件可以讓你在專案中的原始檔之間快速切換。

導航條最左邊是一個選單按鈕,可以快速開啟編輯器最近訪問的歷史檔案或執行其他高階的操作。接著是後退和前進按鈕,可以開啟曾經編輯過的檔案,工作方式與Safari瀏覽器的後退和前進按鈕一樣。這兩個按鈕後面是顯示當前檔案在專案中位置的路徑(不僅是目錄的路徑)。路徑中的每一項都是一個按鈕,可以點選其中任意一個並在彈出的選單中進行檔案導航。

最後一項是函式選單,它顯示的是當前類中的所有函式和方法。如果按住Command按鈕並點選函式選單可以將這些方法按字母順序排列。

除了方法名之外,你還可以向選單中加入其他內容。有兩種方法:一種是用#pragma mark whatever,whatever處可以填寫任何文字,它會出現在函式選單中。例如#pragma mark -則會在選單中插入分割線。另一種是使用 “//MARK:” 、 “//TODO:” 、 “//FIXME:” 、 “//!!!:” 、 “//???:”之類符號開頭的文字註釋,並且將這些文字放入函式選單中。這些都是程式所做的記號;在程式釋出之前最好先看看這些標記。(默然說話:實測,在4.6.2中//!!!:不會顯示在函式選單中,不知道是我沒寫對,還是書上沒說對,還是因為版本升級後把這個註釋給取消了。)

“pragma”源自希臘語,意思是“行動”。#pragma指令將Objective-C常規程式碼之外的資訊或說明傳遞給編譯器和程式碼編輯器。通常,pragma是被忽略的,但它在一些軟體開發工具中可能有其他的含義。比如,可以利用它來給未完成的工作做個標記,以便第二天繼續未完成的工作,或者把程式中應該注意但卻容易忘記的事項寫下來。如果某個工具並不知道pragma是什麼,並不會生成警告或錯誤資訊,而是很聰明地忽略它。

獲取資訊

在程式碼和Cocoa標頭檔案之間自由切換瀏覽是很好的功能,也很方便,但有時你也需要從程式碼之外獲得資訊。幸好,Xcode有一個儲存文件和參考材料的“寶庫”。

1.獲得幫助

檢查器的頂端有兩個圖示。目前第一個圖示是被選中的,檢查器顯示的是當前檔案的各種屬性。另一個圖示可以在檢查器中啟用快速幫助功能。如果想要使用快速幫助,在程式碼中點選做任意位置並觀察檢查器中出現的內容。如果再點選原始碼中的其他位置,快速幫助面板便會更新。

2.文件管理程式

如果你想直接訪問蘋果公司的官方API文件 ,最快的方法是按住option鍵並雙擊某個符號,這是查詢該符號相關文件的快捷方式。

除錯

 bug無處不在,程式中有錯誤是難免的,特別是在當你剛開始使用新的平臺和新的語言時。發現問題後,深吸一口氣,喝一口你最愛的飲料,然後系統地查詢到錯誤的原因。這個過程我們稱之為除錯(debugging)。

暴力測試

  在程式中寫入輸出語句來輸出程式的控制流程和一些資料值。你也許一直在這麼做,只是不知道這種除錯方法叫暴力測試。(默然說話:的確,弄程式這麼多年,第一次聽說這種最常用且有效的方式叫暴力測試。。。。難怪城管們這麼喜歡 。。。。)          

Xcode的偵錯程式

偵錯程式(debugger)是位於你編寫的程式和作業系統之間的程式,它能夠中斷程式,這樣你就可以檢查程式的資料,甚至修改程式。完成這些後,就可以恢復程式並檢視執行結果。你也可以單步執行程式碼,減緩程式執行的速度,細緻地檢視程式碼會對資料進行哪些改動。

Xcode還有一個提供大量概述資訊的除錯視窗,以及一個可以直接向偵錯程式傳送除錯命令的除錯控制檯。

精巧的除錯符號

打算除錯程式時,需要確保你正在使用debug構建配置。你可以在Xcode工具欄中Edit Scheme的下拉選單中找到它。構建配置通知編譯器發出額外的除錯符號,偵錯程式通過這些符號可以知道它們在程式中的位置。

開始除錯

除錯的第一件事自然是設定斷點,方式與絕大多數的IDE一樣,在標有行號的地方單擊,就會看到一個藍色箭頭,那就是新斷點。刪除斷點比較奇特,用滑鼠把藍色箭頭拖出行號欄,還帶有一個爆炸的小動畫。如果你再次單擊藍色箭頭,藍色會變淺,表示它暫時被禁用。

設定完斷點之後點選執行,程式如果經過了斷點,就會停在斷點處。這時,你會在偵錯程式面板上方看到多出一個控制條。

從左邊開始,第一個按鈕用來開啟或關閉偵錯程式窗格。後面的四個按鈕控制著程式接下來的行為。第一個按鈕像播放器的播放按鈕,點選它之後程式會繼續執行,直到下一個斷點,結束或崩潰。

下一個按鈕是單步跳過按鈕,它看起來象一個箭頭躍過了一個小障礙。點選它會執行一行程式碼,然後又停下來,等著你的命令。再下一個按鈕就是單步進入按鈕,它看起來象一個向下的箭頭指著一個小黑點。點選它,它會讓程式碼進入到一個方法或函式(如果程式裡有當前游標所在函式或方法的原始碼的時候,如果你沒有原始碼,它的作用和單步跳過是一致的)。

最後一個按鈕單擊跳出按鈕,單擊它會直接執行完當前執行的函式,程式會停在被呼叫函式的下一行。

再後面的控制元件是一個可以讓你選擇觀察哪條執行緒的下拉選單。

在所有按鈕的右邊是呼叫棧,它顯示的是當前處於活動狀態的函式的集合。

檢查程式

現在程式停止執行了,接下來該做些什麼呢?通常,當你在程式的某個部分設定斷點或者單步執行時,就說明你想了解程式狀態——變數的值。

Xcode有資料提示功能,你可以在變數或方法引數上懸停滑鼠,Xcode會彈出一個小視窗來顯示它的數值。

備忘表

本章提到很多快捷鍵,畫個表總結:

按鍵    描述

Command+[    左移程式碼塊

Command+]    右移程式碼塊

Tab鍵    接受程式碼自動完成提示

Esc鍵    顯示程式碼提示選單

Control+.(半形句號)    迴圈瀏覽程式碼提示

Shift+Control+.(半形句號)    反向迴圈瀏覽程式碼提示

Command+Control+S    建立快照

Control+F    前移游標

Control+B    後移游標

Control+P    移動游標到上一行

Control+N    移動游標到下一行

Control+A    移動游標到本行行首

Control+E    移動游標到本行行尾

Control+T    交換游標左右兩邊的字元

Control+D    刪除游標右邊的字元

Control+K    刪除本行

Control+L    將游標置於視窗正中央

Command+Shift+O    顯示Open Quickly視窗

Command+Control+上方向鍵    開啟相配套的檔案

按住Option鍵雙擊滑鼠    搜尋文件

Command+Y    啟用/禁用斷點

Command+Control+Y    繼續執行(在偵錯程式中有效)

F6    跳過

F7    跳入

F8    跳出

                                                                                                                                                                                                                                                                                               

小結

這章介紹了Xcode的一些基本特徵和使用方法,特別是快捷鍵,這些東西可以提高我們的工作效率。

下章將詳細介紹Cocoa中的一些類。有趣的“類”容終於來啦!