理解蘋(píng)果專業(yè)開(kāi)發(fā)工具Xcode
介紹
Xcode是一個(gè)強(qiáng)大的專業(yè)開(kāi)發(fā)工具,可以簡(jiǎn)單快速、而且以您熟悉的方式執(zhí)行絕大多數(shù)常見(jiàn)的軟件開(kāi)發(fā)任務(wù)。相對(duì)于創(chuàng)建單一類型的應(yīng)用程序所需要的能力而言,Xcode要強(qiáng)大得多,它的設(shè)計(jì)目的是使您可以創(chuàng)建任何想像得到的軟件產(chǎn)品類型,從Cocoa及Carbon應(yīng)用程序,到內(nèi)核擴(kuò)展及Spotlight導(dǎo)入器等各種開(kāi)發(fā)任務(wù),Xcode都能完成。Xcode獨(dú)具特色的用戶界面可以幫助您以各種不同的方式來(lái)漫游工具中的代碼,并且使您可以訪問(wèn)工具箱下面的大量功能,包括GCC,javac,jikes,和GDB,這些功能都是制作軟件產(chǎn)品需要的。它是一個(gè)由專業(yè)人員設(shè)計(jì)的、又由專業(yè)人員使用的工具。
由于能力出眾,Xcode已經(jīng)被Mac開(kāi)發(fā)者社區(qū)廣為采納。而且隨著蘋(píng)果電腦向基于Intel的Macintosh遷移,轉(zhuǎn)向Xcode變得比以往的任何時(shí)候更加重要。這是因?yàn)槭褂肵code可以創(chuàng)建通用的二進(jìn)制代碼,這里所說(shuō)的通用二進(jìn)制代碼是一種可以把PowerPC和Intel架構(gòu)下的本地代碼同時(shí)放到一個(gè)程序包的執(zhí)行文件格式。事實(shí)上,對(duì)于還沒(méi)有采用Xcode的開(kāi)發(fā)人員,轉(zhuǎn)向Xcode是將應(yīng)用程序連編為通用二進(jìn)制代碼的第一個(gè)必要的步驟。
無(wú)論您是已經(jīng)有一定Xcode經(jīng)驗(yàn)的開(kāi)發(fā)者,還是剛剛開(kāi)始遷移的新用戶,都需要對(duì)Xcode的用戶界面及如何用Xcode組織軟件工具有一些理解,這樣才能真正高效地使用這個(gè)工具。這種理解可以大大加深您對(duì)隱藏在Xcode背后的哲學(xué)的認(rèn)識(shí),并幫助您更好地使用Xcode。
Xcode工具定義的信息
在Xcode中的所有活動(dòng),從文件的創(chuàng)建和編輯,到應(yīng)用程序的連編和調(diào)試,都是圍繞著工具來(lái)進(jìn)行的。Xcode工具對(duì)創(chuàng)建軟件產(chǎn)品需要用到的文件和資源進(jìn)行組織,并使您可以對(duì)其進(jìn)行訪問(wèn)。無(wú)論您創(chuàng)建的是什么樣的產(chǎn)品,Xcode都會(huì)為您管理三種類型的信息:
源文件的引用,包含源代碼、圖像、本地化的字符串文件、數(shù)據(jù)模型、以及更多的信息。
目標(biāo),定義要制作的產(chǎn)品。目標(biāo)將制作產(chǎn)品需要的文件和指令組織為一個(gè)可以執(zhí)行的連編動(dòng)作序列。
執(zhí)行環(huán)境,您可以在這個(gè)環(huán)境中運(yùn)行和測(cè)試軟件產(chǎn)品。執(zhí)行環(huán)境定義了運(yùn)行產(chǎn)品時(shí)使用的程序。在很多情況下,這個(gè)程序就是產(chǎn)品的本身,但是不一定是這樣。另外,執(zhí)行環(huán)境還可以定義命令行參數(shù)和需要用到的環(huán)境變量。
Xcode工具中的三個(gè)元素按圖1所示的方式關(guān)聯(lián)在一起。
圖1:Xcode如何使用源文件引用、目標(biāo)、和執(zhí)行環(huán)境。
當(dāng)您執(zhí)行連編和運(yùn)行命令(Command-R)時(shí),Xcode會(huì)對(duì)指定的目標(biāo)進(jìn)行處理,該目標(biāo)則執(zhí)行一系列對(duì)源代碼進(jìn)行操作的動(dòng)作,并最終生成一個(gè)產(chǎn)品。然后,Xcode就用當(dāng)前活動(dòng)的執(zhí)行環(huán)境運(yùn)行該產(chǎn)品。
"但是請(qǐng)等一下" ,您可能會(huì)問(wèn):"為什么要建立一個(gè)執(zhí)行環(huán)境呢?難道我們不能直接運(yùn)行產(chǎn)品嗎?" 這是個(gè)好問(wèn)題。如果這僅僅是運(yùn)行一個(gè)連編了的Cocoa應(yīng)用程序的話,則定義一個(gè)執(zhí)行環(huán)境就太過(guò)復(fù)雜了。然而,有很多產(chǎn)品,比如插件,要求定義一個(gè)宿主應(yīng)用程序才能運(yùn)行產(chǎn)品。執(zhí)行環(huán)境也用于在調(diào)試器中運(yùn)行產(chǎn)品。您甚至可以定義多個(gè)執(zhí)行環(huán)境,以便以不同的方式運(yùn)行同樣的產(chǎn)品。
工具的組&文件列表
在Xcode的用戶界面上,組成工具的源文件引用、目標(biāo)、和執(zhí)行環(huán)境都顯示在組&文件(Groups & Files)列表中。您現(xiàn)在已經(jīng)認(rèn)識(shí)這些組件了,讓我們接著看看各個(gè)組件在組&文件列表中的位置,如圖2所示。下面我們看一下DotView實(shí)例程序。
如果您喜歡的話,可以自行進(jìn)行操作。打開(kāi)/Developer/Examples/AppKit/DotView/DotView.xcodeproj文件就可以了。
圖2:組&文件列表將很多不同類型的信息封裝在一個(gè)簡(jiǎn)潔的界面上
您可以看到,所有的源文件引用都在一個(gè)工具中,您可以展開(kāi)工具中的每個(gè)產(chǎn)品,看看它們是如何組織在一起的,如圖3所示。
圖3:將一個(gè)產(chǎn)品展開(kāi)可以顯示其所有的連編組件,本例顯示的是一個(gè)Cocoa應(yīng)用程序。
同樣地,您也可以展開(kāi)一個(gè)目標(biāo),其內(nèi)容是生成產(chǎn)品所需要的各個(gè)步驟,如圖4所示。
圖4:展開(kāi)一個(gè)目標(biāo),顯示生成產(chǎn)品需要的所有步驟。
工具漫游
組&文件列表中的源代碼文件、工具、目標(biāo)、和執(zhí)行環(huán)境的下面是一組對(duì)工具內(nèi)容進(jìn)行漫游的工具。這些條目以智能組(Smart Groups)的形式存在,智能組的工作方式和Finder中的智能文件夾(Smart Folders)及iTunes中的智能播放列表(Smart Playlists)一樣。這些工具如圖5所示。
圖5:Xcode的組&文件列表中含有幾個(gè)工具,可以幫助您在工具中進(jìn)行漫游。
在某些時(shí)候,Xcode的新用戶會(huì)發(fā)現(xiàn)組&文件列表提供的功能太多了,特別是和他們?cè)谄渌h(huán)境中用慣了的簡(jiǎn)單文件列表相比較的時(shí)候。然而,一旦您熟悉了這些項(xiàng)目的功能,工具面板就會(huì)變成一個(gè)強(qiáng)大的工具,幫助您訪問(wèn)Xcode提供的所有功能。#p#
深入理解源文件引用
現(xiàn)在,您已經(jīng)了解了Xcode工具的基本組件,是時(shí)候?qū)⑽覀兊淖⒁饬﹃P(guān)注在源文件引用上了。如果您雙擊一個(gè)源文件引用,Xcode就會(huì)彈出一個(gè)適合的編輯器,使您可以對(duì)該文件進(jìn)行修改。然而,您可能可以從上面的圖示中推斷出來(lái),一個(gè)源文件引用也意味著一套指令,在源文件被加入到某個(gè)目標(biāo)的時(shí)候執(zhí)行。舉例來(lái)說(shuō),當(dāng)您將一個(gè)Objective-C源代碼文件(帶有.m后綴)加入到工具、并和某個(gè)目標(biāo)相關(guān)聯(lián)的時(shí)候,該文件將會(huì)被加入到目標(biāo)中的編譯源代碼(Compile Sources)步驟中,由GCC編譯器進(jìn)行處理。
您可以通過(guò)Xcode的工具界面來(lái)控制一個(gè)源文件引用是否為某個(gè)目標(biāo)的一部分,如圖6所示。
圖6:Xcode界面,使您可以快速調(diào)整源文件引用和目標(biāo)的關(guān)聯(lián)關(guān)系。
您也可以通過(guò)源文件引用的Get Info(獲取信息)窗口來(lái)調(diào)整這些設(shè)置,訪問(wèn)File > Get Info菜單項(xiàng)或者輸入Command-I可以打開(kāi)該窗口。該窗口如圖7所示。
圖7:文件引用的Info窗口,使您可以指定當(dāng)前文件屬于哪個(gè)目標(biāo),以及設(shè)置其它連編選項(xiàng)。
將之前圖示的Objective-C源文件包含到活動(dòng)的目標(biāo)中會(huì)使其被GCC編譯,并連接到最后的執(zhí)行文件中。如果您不希望將它包含到最后的產(chǎn)品中,則簡(jiǎn)單地將它從生成產(chǎn)品的目標(biāo)中刪除就可以了。#p#
目標(biāo)是如何被處理的
現(xiàn)在,讓我們把注意力轉(zhuǎn)移到目標(biāo)上,并關(guān)注目標(biāo)是如何被處理的。如果您詳細(xì)察看組&文件中的目標(biāo),就可以大致看出生成產(chǎn)品時(shí)發(fā)生了什么。圖8更加詳細(xì)地解釋了生成DotView產(chǎn)品的過(guò)程。
圖8:文件被加入到目標(biāo)后進(jìn)行的動(dòng)作。
通過(guò)圖9所示的連編結(jié)果(Build Results)窗口,您可以看到連編一個(gè)目標(biāo)的整個(gè)工作過(guò)程。您可以訪問(wèn)Build > Build Results菜單項(xiàng)或輸入Command-Shift-B來(lái)彈出連編結(jié)果窗口。
圖9:連編結(jié)果窗口中按步驟顯示的目標(biāo)連編過(guò)程。
連編規(guī)則和設(shè)置
那么,Xcode怎么知道如何處理目標(biāo)中的文件引用呢?這個(gè)問(wèn)題很簡(jiǎn)單:Xcode根據(jù)與目標(biāo)相關(guān)聯(lián)的連編規(guī)則和設(shè)置來(lái)進(jìn)行連編。缺省的規(guī)則和設(shè)置指定:任何使用GCC支持的語(yǔ)言寫(xiě)成的代碼文件,都由GCC來(lái)編譯。然而,如果您希望用先前的GCC版本來(lái)編譯C的源代碼文件,則可以通過(guò)目標(biāo)的Info窗口來(lái)簡(jiǎn)單地進(jìn)行設(shè)置,如圖10所示。
圖10:目標(biāo)的連編設(shè)置和連編規(guī)則,可以在相應(yīng)的Info窗口進(jìn)行修改。
現(xiàn)在,您已經(jīng)詳細(xì)了解了源文件引用和目標(biāo),讓我們看看Xcode工具的最后一部分:執(zhí)行環(huán)境。#p#
執(zhí)行環(huán)境
我們之前已經(jīng)說(shuō)過(guò),執(zhí)行環(huán)境指的是產(chǎn)品如何在Xcode中運(yùn)行。執(zhí)行環(huán)境定義了Xcode應(yīng)該運(yùn)行什么程序,以及如何運(yùn)行這個(gè)程序。您可以建立多個(gè)執(zhí)行環(huán)境,以便在不同的條件下對(duì)產(chǎn)品進(jìn)行測(cè)試。
簡(jiǎn)單地說(shuō),執(zhí)行環(huán)境定義了下列內(nèi)容:
使用什么執(zhí)行文件,可能是目標(biāo)連編之后生成的產(chǎn)品之一,或者系統(tǒng)中的其它執(zhí)行文件。
要傳遞給執(zhí)行文件的命令行參數(shù)。
啟動(dòng)執(zhí)行文件之前需要在執(zhí)行環(huán)境中設(shè)置的環(huán)境變量。
應(yīng)該使用的調(diào)試器,以及如何在調(diào)試器中運(yùn)行執(zhí)行文件。
您可以在Info窗口中看到如何為執(zhí)行文件定義這些項(xiàng)目,如圖11所示。
圖11:您可以通過(guò)執(zhí)行文件的Info窗口考察產(chǎn)品運(yùn)行的細(xì)節(jié)。