Xcode技巧系列:http://www.itdecent.cn/notebooks/7639304/latest
1 什么是編譯方案
編譯方案:一系列編譯設(shè)置的集合,包括了構(gòu)建項目時的編譯配置,以及當(dāng)啟動項目時所使用的運行環(huán)境。
項目創(chuàng)建,系統(tǒng)會自動創(chuàng)建出一個編譯方案,默認(rèn)和項目名稱相同,如下:

圖中BLE就是系統(tǒng)自動創(chuàng)建的編譯方案。
2 編輯管理編譯方案
上圖中,我們點擊Manage Schemes...就可以進(jìn)入管理界面,如圖:

可以看到當(dāng)前項目所有的編譯方案,查看相關(guān)信息等。
2.1 創(chuàng)建新的方案
點擊“+”號,出現(xiàn)創(chuàng)建表單:

填入創(chuàng)建方案所鏈接的對象Target和名稱Name,即可創(chuàng)建。
編譯方案需要和對象綁定一起,因此必須要選擇要綁定的對象。

同時,也可以選擇New Scheme...來創(chuàng)建。
2.2 方案排序,復(fù)制,導(dǎo)入、導(dǎo)出,刪除
1.排序,直接在管理界面拖動即可
2.復(fù)制,選擇要復(fù)制的方案,點擊左下角齒輪,彈出菜單選擇Duplicate,便會復(fù)制出方案
3.導(dǎo)入、導(dǎo)出,點擊方案,點擊齒輪,Export即為導(dǎo)出,Import導(dǎo)入
4.選中要刪除的方案,點擊“-”即可。
刪除對象時,對應(yīng)的方案并不會刪除,需要手動刪除!
2.3 方案管理

Container即為容器。一個項目的情況下,是默認(rèn)的當(dāng)前項目。如果包含多個項目的工作區(qū),可以選擇將方案關(guān)聯(lián)到工作區(qū)或者其他項目。
Shared:方案共享開關(guān)。單人開發(fā)無需關(guān)心該功能。多人開發(fā),如果不需要別人看到自己的編譯方案,不勾選即可。
左上角Autocreate schemes復(fù)選框:表示創(chuàng)建對象時,是否自動創(chuàng)建編譯方案,默認(rèn)勾選。
右上角Autocreate Schemes Now:立即為當(dāng)前對象創(chuàng)建默認(rèn)的編譯方案。
2.4 編輯方案
選擇Edit Scheme即可進(jìn)入編輯方案界面

1.左上角可以選擇和切換需要編輯的方案。
2.底部有復(fù)制方案按鈕。
3.管理方案按鈕可以切換到管理界面。
4.可以開啟共享。
5.左側(cè)列表可以切換操作列表
2.4.1編譯操作Build
編譯操作是項目運行、分發(fā)前必須要做的,編譯優(yōu)先于其他所有操作。編譯操作設(shè)置:

Parallelize Build:并行編譯,允許Xcode并行編譯多個獨立的對象,即不依賴于其它對象可單獨運行的對象。
Find Implicit Dependencies:允許Xcode自動尋找依賴,某些情況下,某個對象依賴于另一個對象才能運行時,Xcode可自動找出此類依賴。上述兩個選項保持默認(rèn)勾選即可。
下方列表列出了當(dāng)前方案所要編譯的全部對象。每個對象右側(cè)有多個復(fù)選框,控制對應(yīng)操作運行之前,是否要編譯該目標(biāo)。一般來說,都是需要編譯的。
如果發(fā)現(xiàn)Xcode不能確定依賴關(guān)系,這時需要開發(fā)者自己通過“+”添加選擇一個對象。如果對象編譯順序十分重要的話,需要取消并行編譯選項。
2.4.2 運行操作Run
運行操作指定運行過程中需要的可執(zhí)行文件、調(diào)試器、運行環(huán)境等選項。

1.info信息:如上圖
Build Configuration:編譯配置,選擇運行時所使用的配置(debug調(diào)試,release發(fā)布),默認(rèn)調(diào)試配置。
Executable:可執(zhí)行文件,選擇運行的可執(zhí)行文件,也可以選擇在運行時手動指定。如果改為沒有包含在本方案中的對象,該對象會自動添加到編譯方案中。沒有可執(zhí)行文件的對象的可以行文件設(shè)置是None。
Debug executable:調(diào)試可執(zhí)行文件,指定是否對當(dāng)前選定的可執(zhí)行文件執(zhí)行調(diào)試操作,如不執(zhí)行,調(diào)試操作無作用。
Debug Process as:允許開發(fā)者以自身賬號或者根用戶的身份運行,如果開發(fā)者要調(diào)試某些需要權(quán)限才能運行的應(yīng)用,則必須使用根用戶。該選項只有MAC程序可以勾選。
Launch:啟動,表示發(fā)起運行操作是自動執(zhí)行可執(zhí)行文件還是需要開發(fā)者自行啟動。

2.Arguments參數(shù):如上圖
開發(fā)者可以控制啟動參數(shù)和環(huán)境變量
Arguments Passed on Launch:啟動時傳遞的參數(shù),可以使用“+”添加啟動時所需要傳遞的特定參數(shù),這些參數(shù)一般情況下可以用在命令行程序上。
Environment Variables:環(huán)境變量,可以添加或覆蓋當(dāng)前應(yīng)用環(huán)境中存在的環(huán)境變量。
Expand Variables Based ON:指定擴(kuò)展Xcode所提供的變量時,要使用哪個可以行文件的特定環(huán)境變量。

3.Options選項
Core Location:定位模擬相關(guān)設(shè)置。allow location simulation:允許模擬器運行時模擬設(shè)備的地理位置。default location:定義模擬器啟動時,首選的地理模擬位置,也可以往項目中添加GPX地理位置來自定義地理模擬位置。
Application Data:允許開發(fā)者從項目中事先將數(shù)據(jù)放置到應(yīng)用程序中,需要application data package(應(yīng)用程序數(shù)據(jù)包)的支持,如果當(dāng)前工作區(qū)中不存在該數(shù)據(jù)包,則不可以進(jìn)行數(shù)據(jù)預(yù)加載操作。
Routing App Coverage File:設(shè)置用于導(dǎo)航、交通相關(guān)的應(yīng)用,開發(fā)者可以在項目中指定一個GeoJSON文件,詳細(xì)說明應(yīng)用所覆蓋的地理區(qū)域。
GPU Frame Capture:為OpenGL之類的使用GPU的應(yīng)用程序提供調(diào)試支持,Xcode可以捕獲CPU繪制出來的每個幀畫面,供開發(fā)者調(diào)試。其中:
- Automatically Enabled:自動啟用,Xcode根據(jù)應(yīng)用代碼推斷是否提供此功能。也可以單獨針對Metal、OpenGL ES框架來進(jìn)行調(diào)試,或者關(guān)閉該調(diào)試功能。
- Metal調(diào)試開發(fā)者還可以選擇是否開啟Metal的API驗證功能,讓Xcode檢測Metal的API是否能夠?qū)崿F(xiàn)預(yù)期的效果。
Background Fetch:后臺獲取,允許開發(fā)者啟用后臺獲取功能,開啟后,應(yīng)用將不會在前臺自動顯示,會在后臺根據(jù)相關(guān)代碼進(jìn)行后臺數(shù)據(jù)獲取操作。需要實現(xiàn)后臺獲取代碼和開啟Xcode的權(quán)限才能使用。
Localization Debugging:本地化調(diào)試,在調(diào)試過程中,選擇是否輸出未經(jīng)本地化操作的字符串。
Application Language:應(yīng)用程序語言,選擇應(yīng)用程序運行時所在的平臺或者所在的環(huán)境的語言,通過該選項,可以模擬應(yīng)用在不同的國家,不同的語言環(huán)境下所工作的情況,默認(rèn)情況下使用系統(tǒng)語言和區(qū)域。
Application Region:應(yīng)用程序區(qū)域,效果同上Application Language。
XPC Services:XPC服務(wù),XPC是OS X處理多進(jìn)程之間通信的服務(wù),如果使用了該服務(wù),則對其進(jìn)行調(diào)試。
Queue Debugging:隊列調(diào)試。
4.Diagnostics診斷選項卡

選項卡指定了一些用于測試和調(diào)試應(yīng)用相關(guān)設(shè)置。
Runtime Sanitization:運行時處理。
- Address Sanitizer:檢測一些內(nèi)存方面的錯誤。
- Thread Sanitizer:檢測多線程方面的錯誤。
- Pause on Issues:依次查看運行時的問題。
Memory Management:開啟一些內(nèi)存管理相關(guān)的服務(wù),這些工具會在控制臺調(diào)試區(qū)域輸出:
- Malloc Scribble:內(nèi)存涂抹,向分配的內(nèi)存中填充0xAA,向已經(jīng)銷毀的內(nèi)存中填入0x55。
- Malloc Guard Edges:邊緣保護(hù),分配大容量的內(nèi)存前后添加保護(hù)。
- Guard Malloc:動態(tài)內(nèi)存分配保護(hù),使用libgmalloc來捕獲常見的內(nèi)存問題,比如緩沖區(qū)溢出。
- Zombie Objects:僵尸對象,僵尸對象表示已經(jīng)被銷毀的對象,開啟后,如果向該對象發(fā)送消息,運行時便會輸出錯誤,并可追蹤到調(diào)用語句。
Logging:設(shè)置調(diào)試過程中,輸出的日志包含的內(nèi)容。
- Malloc Stack:動態(tài)內(nèi)存分配棧,記錄分配內(nèi)存和釋放內(nèi)存時相關(guān)棧的信息。
- Dynamic Linker API Usage:記錄動態(tài)鏈接相關(guān)API的調(diào)用信息。
- Dynamic Library Loads:庫加載信息,記錄動態(tài)鏈接相關(guān)API的調(diào)用信息。
2.4.3測試操作Test
指定當(dāng)前方案使用的單元測試包,如圖:
2.4.4剖析操作Profile
決定了我們使用剖析操作時,Xcode會執(zhí)行何種命令。
2.4.5分析操作Analyze
對編譯操作中指定的對象運行靜態(tài)分析器。
2.4.6打包操作Archive
打包應(yīng)用程序時進(jìn)行的一些個性化設(shè)置。
2.5額外操作
點開操作旁邊的三角形,會出現(xiàn):

- Pre-actions:操作啟用之前所完成的工作。
- Post-actions:操作啟用之后所完成的工作。
選中其中一項,然后可以添加腳本或者添加一個發(fā)送郵件的操作。

我們添加一個編譯完成后,發(fā)送郵件的動作和執(zhí)行腳本的動作:

3 運行目標(biāo)
指定應(yīng)用在哪一個設(shè)備上運行。

還可以設(shè)置目標(biāo)架構(gòu)和SDK版本。通過Window->Devices進(jìn)入設(shè)備管理界面:

很多朋友想添加老版本SDK的模擬器,可以通過下方添加按鈕添加:

點開如果發(fā)現(xiàn)沒有你想要的SDK版本,點開OS Version,選中下載更多版本即可進(jìn)入如下界面:

下載你要的SDK版本即可。
如果是真機,顯示的數(shù)據(jù)更模擬器比起來會有所不同。

真機可以通過View Device Logs查看真機保存的調(diào)試日志,Take Screenshot可以截取當(dāng)前設(shè)備上的畫面。