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

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

在某些方面,這個框圖類似于先前的框圖。舉例來說,主要負責Aqua用戶界面渲染的系統組件Quartz(在Core Graphics框架中實現)是Application Services層的一部分。架構棧的基礎部分是Darwin,包括Cocoa在內的Mac OS X各個部分最終都依賴于Darwin。
但是,如果您進一步查看雨傘框架中的一個(或一組)Cocoa子類或特定的子框架,就會發現Cocoa或者對Mac OS X其它部分有特定的依賴性,或者通過自身的接口向外部提供基礎的技術。下圖部分顯示了上述的依賴性和外部接口。
請注意:雖然Cocoa依賴于特定的框架,但它并不是僅僅“坐”在這些框架的上面。在某些情況下,Cocoa和其它框架(比如Carbon)是對等的,甚至可以實現一些其它對等框架不能實現的任務。Cocoa不僅僅是基礎技術上面的一個面向對象的封裝層。 |

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