蘋(píng)果官方指南:Cocoa的環(huán)境
在Mac OS X操作系統(tǒng)上,Cocoa和Carbon及Java一樣,是一種應(yīng)用程序環(huán)境。它由一組面向?qū)ο蟮能浖?kù)和一個(gè)運(yùn)行環(huán)境組成,它的集成開(kāi)發(fā)環(huán)境和其它應(yīng)用程序環(huán)境相同。
本文將在這個(gè)定義的基礎(chǔ)上進(jìn)行擴(kuò)展,描述Cocoa的目標(biāo)、能力、和物理形式。作為一個(gè)開(kāi)發(fā)者,閱讀這個(gè)功能描述是理解Cocoa的第一步。
Cocoa的環(huán)境
Cocoa應(yīng)用程序正逐漸成為Mac OS X的應(yīng)用程序標(biāo)準(zhǔn)。iPhoto、Safari、和Mail都是Cocoa應(yīng)用程序。這些應(yīng)用程序由于聰明的設(shè)計(jì)、豐富的功能、和激動(dòng)人心的用戶界面而受到了相當(dāng)程度的好評(píng)。但是,對(duì)于一般用戶來(lái)說(shuō)并不明顯(和典型的開(kāi)發(fā)周期相比)的是:這些程序從設(shè)計(jì)階段到最終部署的過(guò)程是多么的快速。作為應(yīng)用程序開(kāi)發(fā)環(huán)境,是什么使Cocoa成為比Carbon切實(shí)可行、甚至是強(qiáng)制性的替代呢?
介紹Cocoa
和所有的應(yīng)用程序環(huán)境一樣,Cocoa包括兩個(gè)方面:即運(yùn)行環(huán)境方面和開(kāi)發(fā)方面。在運(yùn)行環(huán)境方面,Cocoa應(yīng)用程序呈現(xiàn)Aqua用戶界面,且和操作系統(tǒng)的其它可視部分緊密集成,這些部分包括Finder、Dock、和基于所有環(huán)境的其它應(yīng)用程序。Cocoa無(wú)縫地成為了用戶體驗(yàn)的一部分,在運(yùn)行環(huán)境方面表現(xiàn)優(yōu)秀。
但是,程序員更感興趣的是開(kāi)發(fā)方面。Cocoa是一個(gè)面向?qū)ο蟮能浖M件—類(lèi)—的集成套件,它使開(kāi)發(fā)者可以快速創(chuàng)建強(qiáng)壯和全功能的Mac OS X應(yīng)用程序。這些類(lèi)是可復(fù)用和可支配的軟件積木,開(kāi)發(fā)者可以直接使用,或者根據(jù)具體需求對(duì)其進(jìn)行擴(kuò)展。從用戶界面對(duì)象到Bonjour網(wǎng)絡(luò),幾乎每個(gè)想象得到的開(kāi)發(fā)需求都存在對(duì)應(yīng)的Cocoa類(lèi);對(duì)于沒(méi)有預(yù)想到的需求,您可以輕松地從現(xiàn)有類(lèi)派生出子類(lèi)來(lái)實(shí)現(xiàn)。
在各種面向?qū)ο蟮拈_(kāi)發(fā)環(huán)境中,Cocoa有著最為著名的血統(tǒng)。從1989年作為NeXTSTEP推出到現(xiàn)在,人們一直對(duì)它進(jìn)行精化和測(cè)試(參見(jiàn)"一點(diǎn)歷史"部分)。它優(yōu)雅而強(qiáng)大的設(shè)計(jì)完美地適合所有類(lèi)型的快速軟件開(kāi)發(fā):不僅適合開(kāi)發(fā)應(yīng)用程序,也適合開(kāi)發(fā)命令行工具、插件、和不同類(lèi)型的程序包。Cocoa為您的應(yīng)用程序“免費(fèi)”提供很多行為和外觀,使您可以將更多的時(shí)間用于有特色的功能上(有關(guān)Cocoa提供的功能的詳細(xì)信息,請(qǐng)參見(jiàn)"Cocoa應(yīng)用程序的特性"部分)。
在開(kāi)發(fā)Cocoa軟件的時(shí)候,您可以使用多種編程語(yǔ)言?;镜恼Z(yǔ)言是Objective-C。Objective-C擁有自己的Cocoa運(yùn)行環(huán)境,是ANSI C的超集,它在ANSI C的語(yǔ)法和語(yǔ)義特性上(從Smalltalk派生而來(lái))進(jìn)行擴(kuò)展,使之支持面向?qū)ο蟮木幊?。新增的?guī)則簡(jiǎn)單而又易于學(xué)習(xí)和使用。由于Objective-C是基于ANSI C的,您可以自由地將C代碼直接和Objective-C代碼混合在一起。而且,您的代碼可以調(diào)用非Cocoa的編程接口中定義的所有函數(shù),比如Carbon和BSD。您甚至可以將C++代碼混合到Cocoa代碼中,并將它們連接在同一個(gè)執(zhí)行文件中。最后,Cocoa支持Java。Cocoa為此定義了一個(gè)平行的Java類(lèi)庫(kù),并且實(shí)現(xiàn)了一個(gè)將Java接口映射到Objective-C實(shí)現(xiàn)的橋機(jī)制。Cocoa的Java支持使您可以將本地的Java對(duì)象和Cocoa對(duì)象混合在一起使用(在某些限制下)。
重要信息:Cocoa-Java是熟悉Java語(yǔ)言的開(kāi)發(fā)者的學(xué)習(xí)環(huán)境,我們并不推薦將它用于產(chǎn)品開(kāi)發(fā)。Objective-C API會(huì)不斷進(jìn)化,而Cocoa-Java API并不并行維護(hù)。 |
您甚至可以用PyObjC,即Python/Objective-C橋來(lái)進(jìn)行Cocoa編程?;赑yObjC,您可以用Python來(lái)書(shū)寫(xiě)Cocoa程序。Python是一種解釋性的、注重交互的、及面向?qū)ο蟮木幊陶Z(yǔ)言。PyObjC使Python對(duì)象可以向Objective-C對(duì)象傳遞消息,就象傳遞給Python對(duì)象一樣;同時(shí)還使Objective-C對(duì)象可以向Python對(duì)象傳遞消息。更多信息請(qǐng)參見(jiàn)"用Python開(kāi)發(fā)基于PyObjC的Cocoa應(yīng)用程序"文檔,它位于蘋(píng)果開(kāi)發(fā)者聯(lián)盟(Apple Developer Connection)網(wǎng)站上。
核心的Cocoa類(lèi)庫(kù)封裝在兩個(gè)框架中,即Foundation和Application Kit框架。和所有框架一樣,這兩個(gè)框架不僅包含動(dòng)態(tài)共享庫(kù)(有時(shí)是幾個(gè)兼容版本的庫(kù)),還包含頭文件、API文檔、和相關(guān)的資源。Application Kit和Foundation框架的分割反映了Cocoa編程接口分為圖形用戶界面部分和非圖形接口。這兩個(gè)框架對(duì)于最終產(chǎn)品為應(yīng)用程序的Cocoa工程來(lái)說(shuō)都是必要的。還有幾個(gè)較小的、使用Cocoa編程接口的框架和Mac OS X一起發(fā)行,比如Screen Saver(屏幕保護(hù))和Address Book(地址簿)框架。隨著時(shí)間的推移,還會(huì)有更多框架加入到操作系統(tǒng)中。更多信息請(qǐng)參見(jiàn)"Cocoa框架"部分。
Cocoa在Mac OS X中的位置
下圖顯示了一個(gè)簡(jiǎn)化了的Mac OS X系統(tǒng)架構(gòu)框圖:

這個(gè)框圖只是為了一個(gè)簡(jiǎn)單的目的:為那些不熟悉蘋(píng)果平臺(tái)的開(kāi)發(fā)者明確指出Mac OS X的主要組件及其依賴性。為了簡(jiǎn)潔,圖中省略了一些重要細(xì)節(jié),并使其它部分變得模糊。這些細(xì)節(jié)構(gòu)成了框圖的重要部分,顯示Cocoa和Mac OS X其它部分的關(guān)系。
下圖在架構(gòu)級(jí)別上更為精確地反映了Cocoa的位置。這個(gè)框圖將Mac OS X顯示為一系列的軟件層,從系統(tǒng)的基礎(chǔ)Darwin到各種應(yīng)用程序環(huán)境。位于中間的層代表包含在Core Services(核心服務(wù))和Application Services(應(yīng)用程序服務(wù))這兩個(gè)主要的雨傘框架下的系統(tǒng)軟件。在這個(gè)框圖中,一個(gè)層通常依賴于其下面的其它層。

在某些方面,這個(gè)框圖類(lèi)似于先前的框圖。舉例來(lái)說(shuō),主要負(fù)責(zé)Aqua用戶界面渲染的系統(tǒng)組件Quartz(在Core Graphics框架中實(shí)現(xiàn))是Application Services層的一部分。架構(gòu)棧的基礎(chǔ)部分是Darwin,包括Cocoa在內(nèi)的Mac OS X各個(gè)部分最終都依賴于Darwin。
但是,如果您進(jìn)一步查看雨傘框架中的一個(gè)(或一組)Cocoa子類(lèi)或特定的子框架,就會(huì)發(fā)現(xiàn)Cocoa或者對(duì)Mac OS X其它部分有特定的依賴性,或者通過(guò)自身的接口向外部提供基礎(chǔ)的技術(shù)。下圖部分顯示了上述的依賴性和外部接口。
請(qǐng)注意:雖然Cocoa依賴于特定的框架,但它并不是僅僅“坐”在這些框架的上面。在某些情況下,Cocoa和其它框架(比如Carbon)是對(duì)等的,甚至可以實(shí)現(xiàn)一些其它對(duì)等框架不能實(shí)現(xiàn)的任務(wù)。Cocoa不僅僅是基礎(chǔ)技術(shù)上面的一個(gè)面向?qū)ο蟮姆庋b層。 |

蘋(píng)果公司對(duì)Cocoa進(jìn)行了認(rèn)真的設(shè)計(jì),使Cocoa編程接口成為應(yīng)用程序通常需要的基礎(chǔ)技術(shù)訪問(wèn)通道。但是如果您需要的某些能力不能在Cocoa的接口中找到,或者需要對(duì)應(yīng)用程序進(jìn)行更為精細(xì)的控制,那么也可以直接使用底層的框架(Core Graphics就是一個(gè)重要的例子,通過(guò)調(diào)用該框架或OpenGL的函數(shù),您的代碼可以畫(huà)出比Cocoa描畫(huà)方法能做到的、更加復(fù)雜而具有細(xì)微差別的圖像)。幸運(yùn)的是,使用這些低級(jí)別的框架并不是問(wèn)題,因?yàn)榻^大多數(shù)依賴框架的編程接口是用ANSI C寫(xiě)的,Objective-C是其超集。
請(qǐng)注意:架構(gòu)概述部分的目的并不是列舉出Cocoa有哪些接口或者它對(duì)Mac OS X其它部分有哪些依賴性。相反,概述部分只是考慮最有趣的部分,目的是給您一個(gè)有關(guān)框架架構(gòu)的基本思想。 |
Cocoa依賴的、或者通過(guò)類(lèi)和方法為之提供訪問(wèn)通道的主要基礎(chǔ)框架有Core Foundation,Carbon,Core Graphics (Quartz),Launch Services,和Print Core (打印子系統(tǒng))。詳細(xì)信息如下:
Core Foundation。Foundation框架的很多類(lèi)都基于Core Foundation中對(duì)應(yīng)的封裝類(lèi)型。它們之間的這種緊密關(guān)系使“免費(fèi)橋接”技術(shù)—即在兼容的Core Foundation和Foundation類(lèi)型之間實(shí)現(xiàn)類(lèi)型轉(zhuǎn)換—成為可能。某些Core Foundation的實(shí)現(xiàn)又基于Darwin 層的BSD部分。
Carbon。Cocoa使用了Carbon提供的某些服務(wù),因?yàn)橛行〤arbon框架在Core Services和Application Services層中定位為系統(tǒng)級(jí)別的服務(wù)。作為例子,Carbon Core就是這些框架中特別重要的一個(gè),Cocoa使用了它提供的File Manager(文件管理器)組件來(lái)進(jìn)行不同文件系統(tǒng)表示之間的轉(zhuǎn)換。
Core Graphics。Cocoa描畫(huà)和圖像處理類(lèi)(相當(dāng)自然且緊密地)基于Core Graphics框架,它實(shí)現(xiàn)了Quartz和窗口服務(wù)器組件。
Launch Services。NSWorkspace類(lèi)負(fù)責(zé)向外提供Launch Services的潛在能力。Cocoa還使用Launch Services提供的應(yīng)用程序注冊(cè)功能來(lái)獲取與應(yīng)用程序及文檔相關(guān)聯(lián)的圖標(biāo)。
Print Core。Cocoa的打印類(lèi)是打印子系統(tǒng)的一個(gè)面向?qū)ο蟮慕涌凇?/p>
此外,Cocoa還使用Carbon環(huán)境的Text Encoding Converter(文本編碼轉(zhuǎn)換器)服務(wù)來(lái)處理一些字符串編碼轉(zhuǎn)換。還有一些Cocoa方法向外提供I/O Kit框架、QuickDraw (QD)框架、 Apple Event (AE)框架、和ATS框架的部分功能,分別用于進(jìn)行電源管理、QuickDraw描畫(huà)、 Apple Event處理、以及提供字體支持。