Xcode入門祕籍——很多iOS開發者都不知道的基本操作

語言: CN / TW / HK

背景

對於iOS開發者,Xcode是我們最常用的開發工具。能夠熟悉Xcode工具的常用介面元素以及常用快捷鍵和常用除錯方式,對於高效開發非常重要,往往可以讓我們事半功倍。然而由於這些知識點非常瑣碎,所以在使用時往往會忘,常常需要查來查去,本文特意做了歸納總結,希望幫助每個iOS開發者碼code如飛!

一、Xcode介面和常用快捷鍵介紹

1.1 Xcode 頁面介紹

Xcode頁面主要分為以下五個部分:

  • 工具欄(ToolBar area):主要負責程式執行除錯,編輯器功能區域的顯示/隱藏
  • 編輯區(Editor area):程式碼編寫區域
  • 導航區(Navigator area):展示工程檔案列表
  • 除錯區(Debug area):用於程式除錯,檢視物件資訊,列印日誌等
  • 公共區(Utilities area):用於設定物件屬性,新增UI控制元件等。

1.2 資源管理器快捷鍵介紹

詳細功能分別為:

  • 專案導航器(Project navigator):在工程中新增、刪除、分組以及管理檔案、檢視檔案、或者在編輯取區編輯其內容
  • 版本控制管理器 (Source Control navigator):檢視原始碼控制工作副本、分支、提交、標籤和遠端程式碼庫。
  • 符號導航器(Symbol navigator):整合所有在工作區中定義的符號,從根本上說符號就是編輯器所能識別的東西,eg:OC類、結構體、列舉型別、全域性變數等
  • 搜尋導航器(Find navigator):在專案和框架中查詢任何字串、引用、定義以及呼叫層級。
  • 問題導航器(Issue navigator):可檢視在開啟、分析以及構建專案過程中發現診斷、警告以及錯誤資訊
  • 測試導航器(Test navigator):建立、管理、執行以及檢查單元測試
  • 除錯導航器(Debug navigator):檢視專案執行的CPU、記憶體、磁碟、網路等情況,詳細介紹
  • 斷點導航器(Breakpoint navigator):新增、刪除和編輯斷點。
  • 報告(日誌)導航器(Report navigator):檢視構建、執行和除錯專案以及原始碼控制任務的歷史記錄。 分別對應快捷鍵為:Command + 1 ~ 9

1.3 部分頁面顯示和隱藏

上圖從左到右分別為: 1. 隱藏/顯示 左邊專案導航頁面 1. 隱藏/顯示 下面專案Debug區域 1. 隱藏/顯示 右邊工具欄 分別對應快捷鍵如下:

| 作用 | 快捷鍵組合 | | --- | --- | | 隱藏/顯示 左邊專案導航頁面 | Command + 0 | | 隱藏/顯示 下面專案Debug區域 | Command + Shift + Y| |隱藏/顯示 右邊工具欄|Command + Option + 0|

1.4 常用組合快捷鍵

1.4.1 系統截圖快捷鍵

| 作用 | 快捷鍵組合 | | --- | --- | | 擷取當前整個螢幕到檔案 | Command + Shift + 3 | | 擷取當前螢幕到剪貼簿| Command + Shift + Control + 3 | | 擷取所選螢幕區域到檔案 | Command + Shift + 4 | |擷取所選螢幕區域到剪貼簿 | Command + Shift + Control + 4 |

1.4.2 Xcode檔案操作快捷鍵

| 作用 | 快捷鍵組合 | | --- | --- | | 在當前工程中建立一個新檔案(一般包括.h 和 .m檔案) | Command + N | |在當前工程中建立一個新工程| Command + Shift + N| |在工程中關閉當前正在螢幕中顯示的檔案 | Command + W| | 最小化xcode編譯器視窗| Command + M|

1.4.3 Xcode除錯快捷鍵

| 作用 | 快捷鍵組合 | | --- | --- | | 編譯並執行 | Command + R | | 編譯 | Command + B | | 強制退出 | Command + Q | | 停止執行 | Command + . | | 繼續(到下一個斷點,如果沒有則執行到結束) | Command  + Control +  Y | | 單步除錯 | F6 | | 跳入某函式 | F7 | | 跳出某函式 | F8 | | 新增/刪除斷點 | Command + \  (游標必須在指定的行) | | 靜態程式碼分析 | Command + Shift + B |

新版的Mac,如果匹配了觸控欄,在進行單步除錯時需要現將先將F1、F2等功能鍵設定出來。步驟:開啟 “系統偏好設定” ,點選 “鍵盤” 選項,在 “觸控欄顯示”一欄中選擇為“F1、F2等鍵

如果不進行以上設定,則需要按著鍵盤左下角的 「fn」鍵,就可以看到觸控欄上顯示出 F1 等鍵了。

1.4.4 Xcode檔案內編輯快捷鍵

| 作用 | 快捷鍵組合 | | --- | --- | | 左縮排 | Command + [ | | 右縮排 | Command + ] | | 當前檔案搜尋 | Command + F | | 當前檔案文字替換 | Command + Option + F | | 全域性檢索快捷鍵 | Command + Shift  + F | | 全域性文字替換 | Command + Shift  + Option +  F | | 搜尋下一處 | Command + G | | 搜尋上一處 | Command + Shift + G | | 快速跳到當前類的指定行 | Command + L | | 快速查詢開啟某個類 | Command + Shift + O | | 程式碼摺疊與開啟 | Command + Option + ⬅️ 或 ➡️ 游標需放在方法裡 | | 當前檔案修改區域性變數快捷鍵 | Command + Control + E (必須游標在一個變數上面) | | 格式化程式碼 | Control + I | | 將程式碼所在檔案定位到左邊專案導航器中 | Command + Shift  +  J | | 程式中 .h 和 .m 檔案間快速切換 | Command + Control +  ⬆️ 或 ⬇️ | | go Back 或 go Forward | Command + Control + ⬅️ 或 ➡️ | | 去本行程式碼的行首 或 行尾 | Command + ⬅️ 或 ➡️ | | 當前行上移或者下移 | Command + Option + ] / [ |

二、Xcode常用除錯方法

總體來看,關於Xcode基本的除錯方法包括有以下幾個部分:斷點、日誌輸出&&LLDB、效能檢測、和檢視偵錯程式。

2.1 斷點

斷點裡面根據作用和功能也有很多種類:普通斷點、條件斷點、異常斷點、符號斷點等。

2.1.1 普通斷點

當程式執行到斷點處時會暫停執行。比如斷點打在30行,那麼程式就會停在30行(注意:程式只執行到了前29行,第30行其實還沒有被執行。)。只要在程式碼行旁邊點選,就能新增一個斷點,再次點選,斷點變成淺藍色,就能讓斷點不可用(disable了,仍然存在,只是不起作用了)。

2.1.2 條件斷點

打上斷點之後,對斷點進行編輯,設定相應過濾條件。單擊右鍵會彈出選項框,四個選項分別為: - Edit BreakPoint:編輯斷點。 - Disable  BreakPoint:斷點失效。(相當於上邊說到的單擊斷點變成淺藍色,斷點失效) - Delete BreakPoint:刪除斷點。 - Reveal in BreakPoint Navigator:在左邊的斷點樹狀結構表明該斷點。 這裡我主要用到的是第一個:Edit BreakPoint。這裡面設定斷點的篩選條件(雙擊斷點也可以快速進入編輯斷點的對話方塊)。 1. Condition: 返回一個布林值,當布林值為真觸發斷點,一般裡面我們可以寫一個表示式。 2. Ignore: 忽略前N次斷點,到 N+1 次再觸發斷點。 3. Action: 斷點觸發事件,分為以下六種: - AppleScript:執行指令碼。 - Capture GPU Frame:用於OpenGL ES除錯,捕獲斷點處GPU當前繪製幀。 - Debugger Command:和控制檯中輸入LLDB除錯命令一致。 - Log Message:輸出自定義格式資訊至控制檯。 - Shell Command:接收命令檔案及相應引數列表,Shell Command是非同步執行的,只有勾選“Wait until done”才會等待Shell命令執行完在執行除錯。 - Sound:斷點觸發時播放聲音。 4. Options(Automatically continue after evaluating actions選項):選中後,表示斷點不會終止程式的執行。

2.1.3 異常斷點

利用Xcode進行軟體開發時,總避免不了出現異常而導致程式崩潰,但有時候又不知道哪裡出錯,只能利用下斷點一點一點測試,雖然也能測出來但總是不能一步到位。其實Xcode有個異常斷點,可以在導致程式崩潰或者引發異常的那行程式碼上自動設定斷點。

步驟1⃣️:(1)開啟斷點導航器 -> (2)點選下方➕號 ->(3)選擇“Exception Breakpoint”

步驟2⃣️:按照上述步驟選擇之後,將會看到異常斷點的編輯條件,在這裡你可以根據自己的需要編輯自己的異常斷點條件:

Exception選項可以讓你選擇響應Objective-C物件丟擲的異常,也可以選擇響應C++物件丟擲的異常。 Break則是選擇斷點所接收的異常,是接收“Throw”語句丟擲的異常還是Catch語句的。

步驟3⃣️:執行程式,解決問題後。刪除該異常斷點。

2.1.4 符號斷點

Symbolic Breakpoint為符號斷點,可以針對某一個方法(函式)設定斷點並暫停執行;有時候,我們並不清楚會在什麼情況下呼叫某一個函式,那我們可以通過符號斷點來跟蹤獲取呼叫該函式的程式堆疊。

步驟1⃣️:如同設定異常斷點一樣,在點選➕之後,選擇“Symbolic BreakPoint

步驟2⃣️:編輯要斷點的方法名、條件等。

  • Symbol:填入你想設定斷點的方法(例如:-[NSException raise],-號是例項方法,+號是類方法)。
  • Module:填入要設定斷點的方法或函式是否在位於dylib中,預設不填。
  • Conditon:填入條件,例如:(BOOL)[item isEqualToString:@“test”]前面的(BOOL)是必須的。否則console會提示型別不符合,導致條件不能生效。意思是item(NSString)是test時停下。
  • Ignore:忽略幾次。
  • Action:可在程式斷點執行後增加額外動作(Applescript,捕捉動畫幀速,偵錯程式命令(lldb),輸入log記錄,終端命令(shell),播放聲音)例如:Debugger Commond中可填入
    • po item 輸出 item變數的值
    • bt 表示輸出 方法呼叫堆疊資訊 步驟3⃣️:假如輸入的方法名為: [UIView init],此時就可以看到新加的斷點方法。

步驟4⃣️:執行專案,此時Xcode會停在你的斷點方法中。

2.2 日誌輸出

關於日誌輸出,最先可能想到的是在程式碼編輯區的NSLog(),雖然在列印的時候很清晰,但是缺點就是在我們需要在想要列印的位置新增NSLog程式碼並重新執行專案,這樣會比較耽誤時間,影響開發效率,而我們在除錯過程中用的比較多的是打斷點,然後 p 或者 po 一下。這個 p 和 po 就是LLDB中的列印(print)命令。像下圖中,在29行中打了斷點,在下方控制檯的右邊會出現一個"lldb"的對話窗。

2.2.1 help命令

在lldb中輸入help,然後回車,可以看到lldb的一些常用的命令,如下圖所例。常用的命令為po、p、expression、call...

2.2.2 expression命令

expr 或 e : expression 的縮寫,可以在除錯時動態執行指定表示式,並將結果打印出來,是LLDB除錯命令中最重要的命令,我們以後經常用到的 p 和 po 命令的鼻祖 。expression 命令主要有兩個功能: - 執行表示式 - 輸出返回值

注意:雖然 expression 命令有輸出返回值功能,但是在日常除錯過程中並不常用,一般這類列印功能被 p 和 po 命令代替,而 expr 常用於在除錯過程中修改變數的值。

2.2.3 p & print  & e  & call 命令

2.2.4 po 命令

oc裡所有的物件都是用指標表示的,打印出來的是物件的指標,而不是物件本身,可以採用 -o 來列印物件本身為了更加方便的時候,LLDB為 “expression -o --”  定了一個別名 :po ,它可用於輸出OC物件和物件的資訊。

2.2.5 call 命令

方法呼叫:在斷點呼叫某個方法,並輸出此方法的返回值,一般常用於方法的呼叫

2.2.6 image 命令

常用命令如下: - image list:檢視工程中使用的庫 - image lookup:可以用來查詢可執行檔案或共享庫的原始地址,當程式崩潰的時候,可以使用這條命令來查詢崩潰所在的具體位置。 如下程式碼:

執行此程式碼,崩潰資訊如下:

上述crash根據呼叫棧資訊如何定位到具體哪行程式碼出現問題:

我們可以使用在LLDB中使用 image lookup -a 地址  或者  image lookup --address 地址 命令進行定位。

通過逐步檢視呼叫棧資訊,我們可以看到的是在 -[ContainerViewController viewDidLoad] 方法中也就是在 ContainerViewController.m 檔案的第36行陣列越界導致的崩潰。

2.3 LLDB除錯對話窗

從左到右功能依次詳細介紹: 1. 顯示/隱藏控制檯 2. 斷點資訊:如果為藍色,就是斷點有效。如果點選它變成灰色,就是所有斷點不起作用。 3. continue:點選這個按鈕程式就會從當前斷點恢復執行,直到下一個斷點 4. step over :點選這個按鈕會一步一步的執行,方便除錯 5. step in:點選這個按鈕會進入函式內部 6. step out:點選這個按鈕會跳出函式內部,回到函式呼叫處,一般與左邊的按鈕對應使用 7. 檢視偵錯程式:檢視圖層,在第2.4四節中詳細介紹 8. 記憶體結構圖(menory graph):方便檢視堆疊資訊 9. 覆蓋偵錯程式的環境變數設定 10. 模擬器定位開關

2.4 效能檢測

靜態分析:通過對程式碼靜態分析,找出程式碼潛在的錯誤,如記憶體洩漏、空引用、未使用函式等。方法:選單“Product" -> "Analyze" 或者使用快捷鍵  Shift + Command + B ,然後想辦法消滅藍箭頭。

2.5 檢視偵錯程式(Debug View Hierachy)

下面介紹一下在檢視UI時經常用到的檢視偵錯程式:

Debug View Hierachy:除錯檢視層次,除了點選控制檯出的圖示,也可以從選單中選擇 Debug -> View Debugging -> Capture View Hierarchy來啟動檢視除錯。在斷點或者不是斷點的情況下都可以通過點選這個按鈕檢視檢視層級關係。

有了這個圖層關係,我們可以很清楚的知道檢視頁面上的各個控制元件的位置關係,當我們在開發測試階段時遇到某個控制元件不顯示、控制元件被遮擋、或者需要檢視當前檢視view的類檔名時等,都可以通過檢視偵錯程式檢視開進行除錯檢視,提高我們的開發效率。

2.6 除錯導航器

除錯導航器(Debug navigator)在測試專案時極為有用,在這裡我們不僅可以看到APP的【CPU】處理器、【Memory】記憶體、【Disk】硬碟、【Network】網路請求的實時狀態,並且在除錯程式碼時也檢視當前函式的呼叫資訊。

2.6.1 檢視函式的呼叫資訊

假如在下圖中的第47行打了一個普通斷點,此時方法執行到第46行停止,我們可以在除錯導航器中看到當前函式被哪個執行緒的哪個函式呼叫,比如本例中該 viewModel 的懶載入函式其實是在 Thread 1 (main Thread)中的  -[ContainerViewController viewDidLoad] 方法被呼叫。

2.6.2 CPU使用資訊

想要開發出高效能的APP,我們必須對以下面板資訊時刻關注並不斷改進。

2.6.3 記憶體佔用資訊

2.6.4 磁碟佔用資訊

2.6.5 網路請求資訊

總結

本文主要總結介紹了一些關於Xcode使用提效的基本操作,希望能夠幫助對這部分知識不夠熟悉的 iOS 開發的小夥伴解決實際學習和工作中可能遇到的問題. 如有紕漏, 歡迎各位路過的大佬們批評指正,提出寶貴意見。有問題的朋友也希望各位留言討論,與大家共同進步,感謝!

hi, 我是快手電商的小博

快手電商無線技術團隊正在招賢納士🎉🎉🎉! 我們是公司的核心業務線, 這裡雲集了各路高手, 也充滿了機會與挑戰. 伴隨著業務的高速發展, 團隊也在快速擴張. 歡迎各位高手加入我們, 一起創造世界級的電商產品~

熱招崗位: Android/iOS 高階開發, Android/iOS 專家, Java 架構師, 產品經理(電商背景), 測試開發... 大量 HC 等你來呦~

內部推薦請發簡歷至 >>>我們的郵箱: [email protected] <<<, 備註我的花名成功率更高哦~ 😘