Xcode基礎知識與除錯lldb命令
1.Xcode IDE概覽
說明:從左到右,依次是“導航窗格(Navigator)->邊列(Gutter)->焦點列(Ribbon)->程式碼編輯視窗(Standard/Primary Editor)”。
- 邊列(Gutter):顯示行號和斷點。
- 焦點列(Ribbon):灰色深度與程式碼巢狀深度相關:滑鼠懸停可突出顯示右側相應程式碼塊(Focus code blocks on hover),滑鼠單擊可摺疊右側相應程式碼塊(Code folding)。
2.偏好設定
通過“command+,”快捷鍵或”Xcode|Preferences”選單撥出偏好設定。
(1)主題及字型
(Preferences->Fonts & Colors)選中一種主題(theme),例如“Midnight”,推薦使用Monokai、Ciapre。將 `*.dvtcolortheme` 檔案拷貝到 `~/Library/Developer/Xcode/UserData/FontAndColorThemes/`即可安裝主題, 重啟 Xcode 即可選用。
Xcode預設字型為menlo,也可選擇 Consolas、Monaco、Consolas、Droid Sans Mono、Source Code Pro、Bitstream Vera Sans 等其他等寬字型。
shift 選擇主題 Source Editor/Console 中的所有項,點選 Fonts 可更改字型(大小)。
(2)編輯器配置(Preferences->Text Editing)
Editing:
Indentation:
- Show Line Numbers:在gutter中顯示行號。
- Code folding ribbon:顯示焦點列。
Focus code blocks on hover:滑鼠懸停時突出顯示右側相應程式碼塊。
- Page guide at column:顯示一行最多支援80個字元的提示分割線。
- Prefer indent using:Spaces(為保持一致的視覺呈現和行末註釋對齊,建議使用空格)
- Tab width:4 spaces(tab expand,1個tab=4個空格)
- Indent width:4 spaces(自動縮排步長=4個空格)
(3)跳轉開啟方式(Preferences->Navigation)
- Activation:When a tab or window opens,make it active。當新建視窗或標籤時,立即啟用聚焦。
- Navigation:Uses Primary/Focused Editor。開啟Project Navigator中指定的檔案時,在主編輯器視窗/當前聚焦視窗開啟,建議選擇Focused。
- Optional Navigation:Uses Single Assistant Editor。開啟Project Navigator中指定的檔案或跳轉到符號定義所在檔案(command+單擊)時,若按下option鍵,則在輔助視窗開啟。
- Double Click Navigation:Uses Separate Tab。雙擊開啟Project Navigator中指定的檔案或跳轉到符號定義所在檔案(command+雙擊)時,新建標籤頁。
(4)SCM(Preferences->Source Control)
- Enable Source Control:啟用/禁用Xcode自帶Source Control Manager(SCM)。
- Comparison View:Show local revision in [Right] Side。開啟version editor比較視窗時,左側顯示伺服器基線版本(base),[右側]顯示本地修改過的工作拷貝(local working copy)。
(5)SDK/Simulator(Preferences->Downloads)
Downloads:可下載Components(SDK&Simulator)和Documentation。
(6)構建輸出目錄(Preferences->Locations->Locations)
不建議使用絕對路徑,因為寫死之後,換環境或換平臺,又要重新修改路徑,且同名project target的build folder會覆蓋,建議使用相對路徑(Relative)
- 當選擇為Default時,Derived Data的目錄為~/Library/Developer/Xcode/DerivedData。
- 當選擇為Relative時,Derived Data的目錄為當前*.xcodeproj所在的目錄。
- 當選擇為Custom時,Derived Data的目錄需自定義。
3.程式碼閱讀
(1)Help
option+點按:檢視選中符號的幫助提示(Quick Help for Selected Item)。option+雙擊:開啟選中符號的幫助文件。
(2)View Navigator
command+0:Show/Hide left tool panel(Navigator Area)
command+1-8:Project/Symbol/Find/Issue/Test/Debug/Breakpoint/Report Navigator
option+command+0:Show/Hide right tool panel(Utility Area)
option+command+1/2:show the file/quick help inspector
可按下command+0隱藏左側欄Navigator,再按下option+command+0隱藏右側欄Utility,只顯示Standard/Primary Editor,聚焦有效利用螢幕進行編碼。
(3)View Editor Organization
control+1:Show Related Items(例如Superclasses/Subclasses、Callers/Callees、Protocol Implementor/Implemented、Includes/Included By)。可輸入實時搜尋匹配。
control+2/3:Show Previous/Next History。可輸入實時搜尋匹配。
control+4:Show Top Level Items。
control+5:Show Group Files(當前資料夾內的所有檔案)。可輸入實時搜尋匹配。
control+6:Show Document Items(當前檔案的Symbols)。可輸入實時搜尋匹配。
(4)Eidtor Window/Tab Switch
command+shift+[/]:切換標籤頁
單/雙指左右滑動(control+command+←/→):在單標籤頁開啟的多個檔案間切換(Go Back/Forward)
(5)Symbol Jump
command+L:跳轉到指定行。
:Open Quickly,快速全域性查詢檔案、符號,非常常用!
command+點選Editor中選中的符號:跳轉到符號定義(jump to definition)。
control+command+J:跳轉到指定符號的定義處或實現處(Go to Declaration/Definition)。有時工程正在Loading、Indexing或Processing files時,“command+點選”無法響應,此時可試試control+command+J。
control+command+↑/↓:切換標頭檔案/實現檔案(switch between a source file (.m,*.mm,*.cc) and the associated header file(.h),Jump to Previous/Next Counterpart)。
在Project Navigator中選中檔案右鍵或通過選單“File->Show in Finder”:在Finder中定位該檔案。
(6)Symbol Navigator
command+2可聚焦左側導航欄中的符號導航器。
注意:control+6只列出當前程式碼所在interface的符號,而Symbol Navigator是當前工程(Project Scope)的所有符號列表的Hierarchy,符號種類包括Classes/Protocols/Functions/Structs/Unions/Enums/Types/Globals。
- filter0:底部編輯框輸入符號(show symbols with matching name)= filter1 result+filter3 result
- filter1:show only class and protocol symbols (hide other global symbol types),包括project和system層次。
- filter2:show only project-defined symbols,過濾顯示當前工程中的符號。filter2的結果是filter1的子集,較常用。
- filter3:show only containers(hide members),過濾顯示包含該單詞的符號。
編輯器中游標所在符號處,Navigate選單或右鍵快捷選單可[Reveal in Symbol Navigator],在符號導航器中定位當前符號,亦可檢視當前符號所屬類的層次。
(7)Code Folding
option+command+←/→:摺疊當前程式碼塊,包括@interface …@end、@implementation …@endoption+shift+command+←/→:摺疊該檔案內所有程式碼塊(方法/函式:{ Methods&Functions })
control+shift+command+←/→:摺疊當前註釋塊(/*Comment Blocks*/)
(8)Focus Switch
(shift+)option+command+`:MoveFocus to (Previous)Next Area.
command+J:焦點切換(Move Focus),可配合滑鼠和方向鍵。帶‘+’的“Move focus to a new assistant editor”可以快速在輔助編輯視窗中開啟標頭檔案(*.h)/實現檔案(*.m,*.mm)。
shift+command+J:在專案導航中定位當前編輯其中開啟的檔案(Reveal in Project Navigator)。
4.程式碼編輯
(1)File | New
control+command+N:File | New | Workspace
shift+command+N:File | New | Project
(2)Text Editing
command+X/C/V:剪下/複製/貼上
command+Z(+shift):撤銷(重做)/Undo(Redo)
command+[/]:向前/向後縮排(Shift Left/Right)
option+command+[/]:將當前游標所在行程式碼上移/下移一行(Move Line Up/Down)
command+/:以雙斜槓(//)註釋選中的程式碼,再此按下可取消
Parentheses/Brackets/Braces Matching:雙擊某個分隔符(如()、[]、{} 等),Xcode會選中匹配程式碼塊。
Editor→Structure→Balance Delimiter:根據當前游標程式碼所在位置,自動向外擴充套件選擇外層程式碼塊。
(3)Auto Completion
esc(control+.)就當前輸入上下文撥出/隱藏智慧提示列表(Auto Completion List);
上下方向鍵(↑/↓)在智慧提示列表中選擇選項。當然,也可以用control+.;enter選中列表中備選的訊息符號;
tab在輸入符號不完整時可一截一截匹配;選中訊息符號後,tab可在各個引數佔位符之間移動,enter可選中引數佔位符先臨時補位填充。
輸入Objective-C物件及訊息名,然後輸入 ],自動補充物件名左側的[,完成中綴符(infix natation)包圍。
(4)Find選單(control+單擊)
當滑鼠定位或選中某個符號時,可呼叫右鍵快捷選單:對應Find選單中有Find Selected Text in Project、Find Selected Symbol in Project(control+shift+command+F)、Find Call Hierarchy(control+shift+command+H)。
- Find Selected Text in Workspace:在當前工作空間查詢選中文字或游標所在行的OC冒號分割方法名。
- Find Selected Symbol in Workspace:在當前工作空間查詢選中文字符號或游標所在行的OC冒號分割方法符號。
- Find Call Hierarchy:查詢選中文字符號或游標所在行的OC冒號分割方法符號的呼叫著(Callers)。
說明:Find Call Hierarchy等效於control+1|Callers。(5)Find & Replace
command+F:當前檔案查詢。
shift+command+F(command+3):在Find Navigator中全域性查詢。可在[Preferences-General]中設定Find Navigator Detail的顯示行數(當Navigator Area較窄擠壓時)。
對於查找出來的結果可以delete刪除非預期干擾結果條目,也可以多擇或全選Find Results拷貝出來整理分析。 option+command+F:當前檔案替換。
- Find:可指定查詢內容(Text/References/Definitions/Regular Expression);
- 放大鏡:下拉可檢視最近查詢歷史;
- In Project:查詢範圍(可指定Group);
- Text:匹配規則(可指定Containing,Matching,Starting with,Ending with);
- Case:是否區分大小寫(可指定 Matching/Ignoring)。
option+shift+command+F:在Find Navigator中全域性替換。
- Replace:逐個替換;
- All:所有替換;
- Done:替換完成。
(6)Copy Symbol
例如,游標停留在NSMutableArray的insertObject:atIndex的前半截單詞insertObject上時:
有三種複製方式:
通過後兩種快捷方式,可以便捷地複製Objective-C特殊的冒號分隔的訊息符號名稱。
- command+C:Copy(游標所在位置的單詞):insertObject
- control+shift+command+C:Copy Symbol Name(游標所在位置的訊息符號名稱):-insertObject:atIndex:
- option+control+shift+command+C:Copy Qualified Symbol Name(游標所在位置的訊息符號全名,帶所屬類名):-[NSMutableArray insertObject:atIndex:]
(7)Open with External Editor——SublimeText
<1>在左側導航欄(Project Navigator)中選中某個檔案右鍵快捷選單中有【Open with External Editor】,預設呼叫Mac OS X自帶的文字編輯器(TextEdit)開啟。我們可以按照以下步驟設定快捷鍵:可針對Xcode工程程式碼檔案(*.h/*.hh/*.c/*.cc/*.m/*.mm)設定預設開啟程式為Sublime Text.app:右鍵Get Info(command+I),Open With選擇Sublime Text.app並且Change All。然後,Xcode|Open with External Editor將在Sublime Text開啟選中檔案。 <2>另外,可下載安裝OpenInSublimeText外掛,支援呼叫SublimeText開啟Xcode當前正在編輯的檔案。
- 【系統偏好設定(System Preferences)->鍵盤(Keyboard)->快捷鍵(Shortcuts)->應用快捷鍵(App Shortcuts)】,
- 點選+號,選擇應用程式【Xcode.app】
- 準確填寫[選單標題],即選單命令名稱【Open with External Editor】,聚焦[鍵盤快捷鍵]編輯框時,同時按下想要設定的組合鍵即可,例如(⌥⌘O)。
- 從github下載開啟OpenInSublimeText.xcodeproj工程進行編譯(command+B),生成的外掛OpenInSublimeText.xcplugin將被整合到Xcode外掛目錄(~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins)下。
- 重啟Xcode將警告提示Unexpected code bundle "OpenInSublimeText.xcplugin",忽略警告選擇[Load Bundle]即可。
- Xcode Editor選單中將新增[Open In Sublime Text]項,可設定其快捷鍵位為shift+command+S(⇧⌘S)。
5.輔助編輯(Assistant Editor)
(1)開啟/關閉輔助編輯視窗
Assistant Editor有點類似VC中的Code Definition Window,可實現分屏檢視程式碼Counterpart,方便交叉參考程式碼編輯。
- option+command+enter/,:開啟Assistant Editor。
- command+enter:關閉Assistant Editor。
可通過選單[View|Assistant Editor]設定Assistant Editors的方向,例如On Right。
(2)呼叫輔助編輯視窗(option+)
在Mac OS X日常操作中,我們已經認識到option這把單刀雙擲開關的妙用:按住滑鼠移動或三指觸控移動時,按下option鍵可實現豎直塊選;調節音量/亮度時,按住option+shift 可以四分之一單位微調。
使用Xcode快捷鍵進行切換或跳轉動作時,若同時按下可以在輔助編輯視窗中開啟相應檔案或符號(For optional navigation (Option-clicking or Option-choosing a file), opens the file in a new Assistant editor pane.)。若在輔助視窗中操作,則在主視窗(Standard Editor)中開啟。
- option+點選Project Navigator中選中的檔案:在輔助編輯視窗中開啟選中檔案。
- option+command+點選Editor中選中的符號:在輔助編輯視窗中開啟符號定義(jump to definition in assistant editor)。
- option+control+command+↑/↓:在輔助視窗中開啟對應的標頭檔案(*.h)/實現檔案(*.m,*.mm,*.cc)。
點選檢視shift+command+O、shift+command+F(command+3)選中的檔案或符號時,可同時按下option在輔助編輯視窗中開啟。
在control+1~6中開啟選擇結果時,均可同時按下option在輔助編輯視窗中開啟。
(3)導航窗格(option+shift+)
在Xcode以上種種切換跳轉操作時,按下option的同時按下shift,通常會撥出一個導航窗格(option+command+<),可選擇在new window/tab/assistant-editor開啟顯示。
For Option-Shift navigation (Option-Shift-click or Option-Shift-choose a file), Xcode displays a graphical navigation chooser showing the current layout. The chooser prompts you to open the file in any open editor pane in any window and tab, or to open the file in a new editor pane, window, or tab.
(1)檢視環境變數巨集
命令列進入HelloWorld工程目錄,執行xcodebuild命令並帶上“-showBuildSettings”引數:
$ xcodebuild -project HelloWorld.xcodeproj -target HelloWorld -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt
則xcodebuild_showBuildSettings.txt中儲存了Build settings for action build and target "HelloWorld”,其中dump了所有的環境變數。
(2)Xcode5(Mac OS X 10.9)的部分環境變數
約定1:~=當前賬戶的HOME目錄,例如“/Users/faner”。
約定2:build構建基礎路徑:BUILD_PATH = ~/Library/Developer/Xcode/DerivedData/Build。可通過“File->Project Settings”檢視Derived Data Location。
約定3:環境變數巨集(Build Setting Macros)引用格式:${MACRO},同Build Phases Run Script中的語法。
下面是摘選自xcodebuild_showBuildSettings.txt的部分常用環境變數。
(a) ARCH & PLATFORM & SDK
ARCHS = i386
CURRENT_ARCH = i386
PLATFORM_DIR = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform
PLATFORM_NAME = macosx
SDKROOT = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
SDK_DIR = /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
SDK_NAME = macosx10.9
(b) PROJECT & SOURCE
PROJECT = HelloWorld
PROJECT_DIR =~/Projects/Learn Objective-C/HelloWorld
PROJECT_FILE_PATH =${PROJECT_DIR}/HelloWorld.xcodeproj
PROJECT_NAME = HelloWorld
SOURCE_ROOT =${PROJECT_DIR}
SRCROOT =${PROJECT_DIR}
(c) BUILD & CONFIGURATION
BUILD_DIR =BUILD_PATH/Products
BUILD_ROOT =BUILD_PATH/Products
BUILT_PRODUCTS_DIR =BUILD_PATH/Products/Debug
CONFIGURATION = Debug
CONFIGURATION_BUILD_DIR =BUILD_PATH/Products/Debug
CONFIGURATION_TEMP_DIR =BUILD_PATH/Intermediates/HelloWorld.build/Debug
(d) PRODUCT & TARGET
PRODUCT_NAME = HelloWorld
PRODUCT_TYPE = com.apple.product-type.tool// Project Template: Command Line Tool
TARGET_BUILD_DIR =BUILD_PATH/Products/Debug
TARGET_NAME = HelloWorld
(3)設定環境變數
Product -> Edit Scheme(option+command+R)->Arguments->Environment Variables中可以新增自定義環境變數(Name為名稱,Value為值)。
在Xcode|Build Phases中Add Run Script Build Phase的Run Script將會使用到環境變數。
7.構建配置
(1)Target & Scheme
一個Target是指在一個Project中構建的一個產品,它包含了構建該產品的所有檔案,以及如何構建該產品的配置。
一個定義好構建過程的Target成為一個Scheme,可在Scheme中定義Target的六種構建過程:Build/Run/Test/Profile/Analyze/Archive。Product ->Edit Scheme(編輯配置,快捷鍵為option+command+R或shift+command+,/command+<)->Manage Schemes可對Scheme的六種構建過程進行配置(可配置項包括Info、Arguments、Options)。
在Project Navigator中選中某個xcodeproj(例如QQ.xcodeproj),將進入Project Setting頁面,可點選左側圖示show/hide project and targets list:
點選targets項可分別設定各target的Build Settings;右擊可對target進行delete。
(2)Build Settings
Architectures:Supported Platforms(OS X、iOS),Base SDK,(Valid)Architectures(armv7、arm64、i386)。
- Build Active Architecture Only:一般Debug會選擇YES,表示只是編譯連線除錯的目標真機對應的CPU指令集;對於Release Archive版本,需要選擇NO,這樣編譯出來的安裝包才能同時支援在armv7、arm64機型上安裝。
Build Locations:配置構建目錄,包括Intermediate Build Files Path、Build Products Path及其針對Per-Configuration的配置。
Build Options:
- Compiler for C/C++/Objective-C預設時Apple LLVM 7.0;
- Debug Information Format:真機連線除錯時,可斷點定位跟蹤除錯,可選擇DWARF以加快編譯速度;但是真機斷開Xcode執行出現crash時,沒有除錯符號將無法逆向解析定位出問題的程式碼符號及其所在具體位置,故一般要選擇DWARF with dSYM File。
- 此外還包括Bitcode和Testability兩個使能開關。
Deployment:配置釋出及安裝選項。
Linking:
- Dead Code Stripping:一般對Debug關閉,對Release版本開啟以去除無效路徑殭屍程式碼,壓縮安裝包體積。
- Display Mangled Names(LINKER_DISPLAYS_MANGLED_NAMES):針對C++ symbols,ld --no-demangle連結開關,一般選擇NO。
- Mach-O type:Static Library、Dynamic Library、Executable、Bundle、Relocatable Object File(Position-Dependent )。
- Other Linker Flags:例如fobjc-arc(可在Build Rules中針對單個檔案配置ARC開關)、-force_load。
- Write Link Map File:寫LinkMap檔案。
- Path to Link Map File:指定連結LinkMap檔案路徑。
Packaging:
- Info.plist File:指定plist檔案,對應頂部Info標籤。
- Product Name:為應用名稱,例如QQ。
- Wrapper Extension:為應用擴充套件,例如app。
Search Paths:
- Info.plist File:指定plist檔案,對應頂部Info標籤。
- Framework Search Paths: *.framework搜尋路徑。
- Header Search Paths:*.h/*.hh標頭檔案搜尋路徑。
- Library Search Paths:靜態庫、動態庫搜尋路徑。
Apple LLVM 7.0配置:
⭐️Code Generation:⭐️Custom Complier Flags:
- Generate Debug Symbols:YES
- Optimization Level:優化級別,-Os
⭐️Language⭐️Preprocessing:定義Preprocessor Macros,例如DEBUG、NDEBUG=1。
- language-Objective-C:Objective-C Automatic Reference Counting,ARC開關。
⭐️Warning Policies:例如可以提高警告級別當作錯誤(Treat Warnings as Errors:YES)。(3)Build Phases
Target Dependencies:設定依賴target。
Copy Bundle Resources:拷貝的資原始檔。
Compile Sources:該target需要編譯的原始碼檔案。
Link Binary with Libraries:需要連結的庫(*.a、*.framework)。
Embed App Extensions:該APP對應的擴充套件外掛。
可以點選加號,New Run Script Phase,配置custom actions after compiling the Xcode project,相當於Visual Studio的Post-builtstep。
當然,也可以在Edit Scheme中設定Pre-actions(custom actions after compiling the Xcode project)、Post-actions(將在編譯連結完成後執行指令碼)。
以下Shell指令碼將生成的二進位制(Unix executable)檔案HelloWorld拷貝到~/Software,然後cd到該目錄下並執行HelloWorld:
(4)Build
shift+command+K:清除products|debug或release下的Unix executable檔案。
option+shift+command+K:刪除構建目錄(Delete/Clean Build Folder),清理Derived Data對應target目錄下的Build資料夾(包括intermediate和products)。通常用於重新編譯整個工程,嘗試解決增量編譯時部分符號陳舊導致連結不通過的問題。
Product -> Edit Scheme(option+command+R)->Info->Build Configuration:選擇生成版本(Debug or Release)
command + B:構建(Buid)
command+8可聚焦左側導航欄中的日誌報告導航器,其中可以檢視Build日誌。
(5)Issue & Errors
command+4可定位Issue Navigator:
當編譯錯誤(error)和警告(warning)過多時,點選底端的感嘆號,即可忽略編譯警告,只顯示編譯錯誤:
(6)Run
command + R:執行(Run),可能會重新編譯連結。
option+command + R:如果確定程式碼沒有改動,加option鍵可免重新編譯連結,直接執行上次build成功的product(Run Without Building)。
command + .:停止執行(Stop)。
(7)Devices & Destination
定義好Target構建配置後,接下來需要指定目標機編譯。
目標機的iPhoneOS.platform必須>=Deployment Target,且Xcode必須支援該機型:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/目錄下必須含有對應iOS系統版本的DeveloperDiskImage.dmg,否則真機編譯會提示Could not find developer disk image。
shift+command+2:可以檢視當前連線的Device和支援的Simulator。
control+option+command+[/]:Select Previous/Next Destination,在連線多個真機或模擬器之間切換。
8.執行除錯
(1)Console
shift+command+Y:顯示控制檯(Show/Hide the debug area)
shift+command+C:啟用聚焦控制檯,游標定位到控制檯呈可輸入狀態
command+K:清除控制檯(Debug->Debug Workflow->Clear Console)
(2)Breakpoint
command + \:當前行設定/取消斷點;通過滑鼠點選邊列中的藍色斷點來啟用/禁用當前行斷點。
command + Y:全域性啟用或禁用所有的斷點,啟用進入除錯模式(此時斷點藍色可見)。
邊列(Gutter)中的斷點/警告可右鍵撥出Reveal in Breakpoint/Issue Navigator。
trick:編輯斷點(Edit Breakpoint):
Condition:設定斷點的觸發條件,例如“i==3”(注意不能有空格)表示當i等於3時該斷點才會被觸發。
Ignore:設定斷點需要被忽略多