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] <<<, 備註我的花名成功率更高哦~ 😘