第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中的一些類。有趣的“類”容終於來啦!