1.瞭解IDE窗口
(1)窗口布局一覽
(2)更改公司名稱的方法
//
// ViewController.h
// LearnXcode
//
// Created by SharonHu on 15/7/14.
// Copyright (c) 2015年Sharon. All rights reserved.
//
(3)一些使用技巧
A.過濾列表文件
使用導航器面板底部的搜索框可以過濾源列表文件,例如下圖搜索出了名稱中帶有guide的文件。你可以在任意的導航器視圖中使用這個搜索框。
2.Xcode偏好設置
(1)主題及字體(Preferences->Fonts & Colors)
選中一種主題(theme),例如“Midnight”,然後shift選擇Source Editor/Console中的所有項,點擊Fonts設置字體。Xcode默認字體爲menlo,可選Consolas、Monaco等其他等寬字體。
(2)文本編輯配置(Preferences->Text Editing)
Editing:
- Show Line Numbers:在編輯面板中顯示行號。
- Code folding ribbon:顯示摺疊ribbon。
- Page guide at column:顯示一行最多支持80個字符的提示分割線。
- Prefer indent using:Spaces(爲保持一致的視覺呈現和行末註釋對齊,建議使用空格)
- Tab width:4 spaces(tab expand,1個tab=4個空格)
- Indent width:4 spaces(自動縮進步長=4個空格)
(3)SCM(Preferences->Source Control)
Enable Source Control:啓用/禁用XCode自帶Source Control Manager(SCM)。
(4)SDK/Simulator(Preferences->Downloads)
Downloads->Components:可下載SDK和Simulator。
(5)構建輸出目錄(Preferences->Locations->Locations)
- 當選擇爲Default時,Derived Data的目錄爲~/Library/Developer/Xcode/DerivedData。
- 當選擇爲Relative時,Derived Data的目錄爲當前.xcodeproj所在的目錄。
- 當選擇爲Custom時,Derived Data的目錄需自定義。
3. 在Xcode的幫助下編寫代碼
(1)首行縮進(美觀排版)
(2)代碼自動完成
(3)批量編輯
(4)查找替換功能
(5)重命名某一個符號的名稱
4.代碼導航
(1)emacs快捷鍵組合
(2)快速打開的竅門
(3)代碼摺疊(code folding)
5.獲取信息
(1)獲得幫助
(2)文檔管理程序
6.調試運行
(1)Console & Scheme
shift+command+Y:顯示控制檯(Show/Hide the debug area)
shift + command + K:清除控制檯(Clean)
option+command+R:編輯配置(Edit Scheme
(2)Build
Product -> Edit Scheme(option+command+R)->Info->Build Configuration:選擇生成版本(Debug or Release)
command + B:構建(Buid)
(3)Target
一個定義好構建過程的Target成爲一個Scheme,可在Scheme中定義Target的六種構建過程:Build/Run/Test/Profile/Analyze/Archive。
一個Target是指在一個Project中構建的一個產品,它包含了構建該產品的所有文件,以及如何構建該產品的配置。
Product -> Edit Scheme(option+command+R)->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。
(4)Issue & Errors
編譯錯誤(error)和警告(warning)過多時,只顯示編譯錯誤:
點擊底端的感嘆號,即可只顯示編譯錯誤,忽略編譯警告:
(5)Run
command + R:運行(Run),可能會先編譯。若按下control直接運行上次build的product(Run Without Building)。
command + .:停止運行(Stop)
(6)Breakpoint
command + \:當前行設置/取消斷點;通過鼠標點擊藍色斷點來啓用/禁用當前行斷點。
command + Y:全局激活或禁用所有的斷點,激活進入調試模式(此時斷點藍色可見)。
邊列(Gutter)中的斷點/警告可右鍵呼出Reveal in Breakpoint/Issue Navigator。
trick:編輯斷點(Edit Breakpoint):
Condition:設置斷點的觸發條件,例如“i==3”(注意不能有空格)表示當i等於3時該斷點纔會被觸發。
Ignore:設置斷點需要被忽略多少次纔會中斷,若設置成5則表示第6次遇到該斷點時才觸發。
Action:設置斷點觸發時的動作,可以爲Debugger Command、Log Message、Shell Command或Sound。
例如可設置以下Debugger Command:
(1)讀取std::string sig的內存buffer值:mem read sig.c_str() -c sig.size();
(2)打印NSData實例sig:po sig
(7)Debug
F6:下一步(Step Over),逐過程單步調試,不進入函數體。
(fn+)F7:進入(Step Into)函數體。可能與多媒體鍵有衝突,故需要fn輔助。
(fn+)F8:跳出(Step Out)函數體。可能與多媒體鍵有衝突,例如呼叫iTunes,故需要fn輔助。
control+command+Y:逐斷點(continue)繼續執行。
trick:移動指令指針(Move the instruction pointer):
斷點調試運行時,可以將綠色指針箭頭(Line 47)移動到其他行(Line 49)或其他斷點(Line 51)實現跳轉執行。
(8)Watch
shift+command+M:Debug Workflow->View Memory。
command+K:Debug Workflow->Clear Console。
Debug Workflow->Show Disassembly When Debugging,可進行彙編指令級調試。
trick:修改變量內存值(change memory value while debugging):
調試運行時,可以在底部的調試窗口(Debug Area,可通過Shift+Command+Y呼出)右鍵某個變量,除了可以進行View Memory/View Value As之外,還可以選擇Edit Value運行時編輯內存變量的值。
這種手動設置指定值,在調試某些難以復現的bug或進行邊界測試非常有用,可以避免在驗證某個問題時反覆改值重新編譯。
(9)lldb調試命令
- n/next:step over;
- s/step:step into;
- finish:step out;
- c/continue:goto next breakpoint;
- expr/expression:Evaluate a C/ObjC/C++ expression(動態執行C/ObjC/C++表達式);
// 打印SYSTEM_VERSION(可能要加UIDevice*轉換)
- p/print/expr/expression:print as a C/C++ basic variable;
(lldb)p [[[UIDevice currentDevice] systemVersion] doubleValue]// 打印屏幕bounds(可能要加UIScreen*轉換)
- po/expr -O/expression -O:Print as an Objective-C object;
(lldb)po NSStringFromCGRect([[UIScreen mainScreen] bounds])
// 打印狀態欄frame(可能要加UIApplication*轉換)
(lldb)po NSStringFromCGRect([UIApplication sharedApplication].statusBarFrame)
- call:調用。其實上述p/po後接表達式(expression)也有調用的功能,一般只在不需要顯式輸出,或是無返回值時使用call,用於動態調試插入調用代碼。
// 調用後,繼續運行程序,view的背景色將變成紅色
- 例如可以在viewDidLoad:裏面設置斷點,然後在程序中斷的時候輸入以下命令:
(lldb) call [self.view setBackgroundColor:[UIColor redColor]]
- bt(backtrace),打印當前調用堆棧(crash堆棧),“bt all”可打印所有thread的堆棧(相當於command+6的Debug Session Navigation)。
- image:可用於尋址,有多個組合命令,比較實用的一種用法是尋找棧地址對應的代碼(行)位置。
- 例如某個UITableView總共有2個section,當其引用的currentSection.index≥2時將會引起[UITableView rectForHeaderInSection:]調用異常,可使用expr動態改值製造crash場景模擬調試。
- 此時crash時的控制檯bt顯示異常出現在應用層代碼“0x00d055b8 - [FACategoryTableView FACategorySectionHeaderDidTouched:] + 744”處(其中0x00d055b8爲當前棧(代碼段)偏移量,744爲棧幀偏移量——PC指針相對函數入口的偏移)。
- 那麼具體是FACategoryTableView.m文件哪一行代碼調用引起的異常呢?此時通過“image lookup --address”後接bt的call stack中的代碼段偏移地址(0x00d055b8)即可定位出異常調用的代碼行位置。
- memory write:改寫指定地址的內存(Write to the memory of the process being debugged)。可help mem write查看幫助:
x/memory read:dump指定地址的內存(Read from the memory of the process being debugged),後接起止地址或-c指定count加起始地址。可help mem read查看幫助:
Syntax:
memory read <cmd-options> <address-expression> [<address-expression>]
Command Options Usage:
size指定內存塊(block/item)的大小,默認爲1byte。
--size <byte-size> ):The size in bytes to use when displaying with the selected format.
count指定內存塊(block/item)的個數,可配合起始地址使用。
-c <count> ( --count <count> ):The number of total items to display.
format指定內容顯示格式,格式符同print:c-char,s-string,d-decimal,x-hex。
-f <format> ( --format <format> ):Specify a format to be used for display.
Command Samples:
(a)起止地址
(lldb)mem read 0x10b88f0c 0x10b88f0c+9
0x10b88f0c: 39 38 37 36 35 34 33 32 31 987654321
(b)起始地址+內存塊count
(lldb)mem read 0x10b88f0c -c 9
0x10b88f0c: 39 38 37 36 35 34 33 32 31 987654321
(c)起始地址+內存塊size+內存塊count(dump hex format)
(lldb)memory read -s 1 -f x -c 9 0x10b88f0c
0x10b88f0c: 0x39 0x38 0x37 0x36 0x35 0x34 0x33 0x32
0x10b88f14: 0x31
(d)起始地址+內存塊size+內存塊count(dump char format)
(lldb)memory read -s 1 -f c -c 9 0x10b88f0c
0x10b88f0c: 987654321
(e)起始地址+內存塊size+內存塊count(dump string format)
(lldb)mem read 0x10b5cf2c -f s -c 1
0x10b88f0c: "987654321"
(f)起始地址+內存塊size+內存塊count(dump int format)
(lldb)memory read -s 4 -f x -c 3 0x10b88f0c
0x10b88f0c: 0x36373839 0x32333435 0x109f0031
Syntax: memory write <cmd-options> <address> <value> [<value> [...]]
(10)啓用NSZombieEnabled調試EXC_BAD_ACCESS
默認設置下 Xcode不會給你定位具體是哪一行代碼不該去使用已釋放的對象,或者release用錯了。
Product -> Edit Scheme(option+command+R) -> Diagnostics ,勾選“Objective-C”之後的“Enable Zombie Objects”。
設置NSZombieEnabled環境變量後,一個對象銷燬時會被轉化爲_NSZombie;設置NSZombieEnabled後,當你向一個已經釋放的對象發送消息,這個對象就不只是報EXC_BAD_ACCESS Crash,還會放出一個錯誤消息,然後以一種可預測的可以產生debug斷點的方式消失, 因此我們可以找到具體或者大概是哪個對象被錯誤的釋放或引用了。
注意:NSZombieEnabled只能在調試的時候使用,千萬不要忘記在產品發佈的時候去掉,因爲NSZombieEnabled不會真正去釋放dealloc對象的內存,一直開啓後果自負!