什么是Cocoa?
在Mac OS X操作系統上,Cocoa和Carbon及Java一樣,是一種應用程序環境。它由一組面向對象的軟件庫和一個運行環境組成,它的集成開發環境和其它應用程序環境相同。
本章將在這個定義的基礎上進行擴展,描述Cocoa的目標、能力、和物理形式。作為一個開發者,閱讀這個功能描述是理解Cocoa的第一步。
本部分包含如下內容:
Cocoa的環境
Cocoa應用程序的特性
開發環境
Cocoa框架
一點歷史
?
Cocoa的環境
Cocoa應用程序正逐漸成為Mac OS X的應用程序標準。iPhoto、Safari、和Mail都是Cocoa應用程序。這些應用程序由于聰明的設計、豐富的功能、和激動人心的用戶界面而受到了相當程度的好評。但是,對于一般用戶來說并不明顯(和典型的開發周期相比)的是:這些程序從設計階段到最終部署的過程是多么的快速。作為應用程序開發環境,是什么使Cocoa成為比Carbon切實可行、甚至是強制性的替代呢?
本部分包含如下內容:
介紹Cocoa
Cocoa在Mac OS X中的位置
介紹Cocoa
和所有的應用程序環境一樣,Cocoa包括兩個方面:即運行環境方面和開發方面。在運行環境方面,Cocoa應用程序呈現Aqua用戶界面,且和操作系統的其它可視部分緊密集成,這些部分包括Finder、Dock、和基于所有環境的其它應用程序。Cocoa無縫地成為了用戶體驗的一部分,在運行環境方面表現優秀。
但是,程序員更感興趣的是開發方面。Cocoa是一個面向對象的軟件組件—類—的集成套件,它使開發者可以快速創建強壯和全功能的Mac OS X應用程序。這些類是可復用和可支配的軟件積木,開發者可以直接使用,或者根據具體需求對其進行擴展。從用戶界面對象到Bonjour網絡,幾乎每個想象得到的開發需求都存在對應的Cocoa類;對于沒有預想到的需求,您可以輕松地從現有類派生出子類來實現。
在各種面向對象的開發環境中,Cocoa有著最為著名的血統。從1989年作為NeXTSTEP推出到現在,人們一直對它進行精化和測試(參見"一點歷史"部分)。它優雅而強大的設計完美地適合所有類型的快速軟件開發:不僅適合開發應用程序,也適合開發命令行工具、插件、和不同類型的程序包。Cocoa為您的應用程序“免費”提供很多行為和外觀,使您可以將更多的時間用于有特色的功能上(有關Cocoa提供的功能的詳細信息,請參見"Cocoa應用程序的特性"部分)。
在開發Cocoa軟件的時候,您可以使用多種編程語言。基本的語言是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編程。基于PyObjC,您可以用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中的位置
圖1-1顯示了一個簡化了的Mac OS X系統架構框圖:
?
圖1-1??Mac OS X架構—簡化視圖
?
這個框圖只是為了一個簡單的目的:為那些不熟悉蘋果平臺的開發者明確指出Mac OS X的主要組件及其依賴性。為了簡潔,圖中省略了一些重要細節,并使其它部分變得模糊。這些細節構成了框圖的重要部分,顯示Cocoa和Mac OS X其它部分的關系。
圖1-2在架構級別上更為精確地反映了Cocoa的位置。這個框圖將Mac OS X顯示為一系列的軟件層,從系統的基礎Darwin到各種應用程序環境。位于中間的層代表包含在Core Services(核心服務)和Application Services(應用程序服務)這兩個主要的雨傘框架下的系統軟件。在這個框圖中,一個層通常依賴于其下面的其它層。
?
圖1-2??Cocoa在Mac OS X架構中的位置
?
在某些方面,這個框圖類似于先前的框圖。舉例來說,主要負責Aqua用戶界面渲染的系統組件Quartz(在Core Graphics框架中實現)是Application Services層的一部分。架構棧的基礎部分是Darwin,包括Cocoa在內的Mac OS X各個部分最終都依賴于Darwin。
但是,如果您進一步查看雨傘框架中的一個(或一組)Cocoa子類或特定的子框架,就會發現Cocoa或者對Mac OS X其它部分有特定的依賴性,或者通過自身的接口向外部提供基礎的技術。圖1-3部分顯示了上述的依賴性和外部接口。
請注意:雖然Cocoa依賴于特定的框架,但它并不是僅僅“坐”在這些框架的上面。在某些情況下,Cocoa和其它框架(比如Carbon)是對等的,甚至可以實現一些其它對等框架不能實現的任務。Cocoa不僅僅是基礎技術上面的一個面向對象的封裝層。
?
?
圖1-3??進一步考察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處理、以及提供字體支持。
進一步閱讀:?Mac OS X技術概瀏覽一書給出有關框架、服務、技術、和Mac OS X其它組件的概覽。蘋果人機界面指南一書則專注于說明Aqua人機界面的外觀和行為。
?
Cocoa應用程序的特性
創建一個Cocoa應用程序,而又不必編寫哪怕一行代碼的情況是可能的。在Xcode中建立一個新的Cocoa工程,然后進行連編就可以了。當然,這個應用程序不做很多工作,至少不做很多有趣的工作。但是,這個極度簡單的應用程序在鼠標雙擊時仍然可以啟動,可以在Dock上顯示圖標,可以顯示其主菜單和窗口(標題為“Window”),可以根據命令將自身隱藏,可以和其它運行著的應用程序互動,還可以處理退出命令。您可以對這個窗口進行移動、調整尺寸、最小化、和關閉,甚至可以打印包含在窗口中的空白部分。
想像一下如果加入一點代碼,您可以做些什么。
在編程方面,Cocoa為開發者提供很多免費或代價很低的支持。當然,要成為一個高效率的Cocoa開發者意味著要熟悉新的概念、設計模式、編程接口、和開發工具,而這方面的努力并不是無足輕重的。但是熟能生巧,編程在很大程度上變成一種將Cocoa提供的編程組件和負責定義特殊邏輯的定制對象及代碼裝配在一起、再將這些裝配物組合在一起的練習。
接下來的部分是一個簡短的列表,說明Cocoa如何為您的應用程序增加價值,而只需要您加入少量的工作(有時候甚至不需要):
-
基本應用程序框架—Cocoa為事件驅動的行為和應用程序、窗口、工作空間(workspace)的管理提供了基礎設施。在大多數情況下,您不必直接處理事件或發送任何描畫命令給渲染庫。
-
用戶界面對象—Cocoa為應用程序的用戶界面提供了豐富而又現成的對象。這些對象的大部分都在Interface Builder(創建用戶界面的開發工具)的選盤上,您只要簡單地將對象從選盤拖拽到界面上,配置好屬性,并將它連接到其它對象上就可以了(當然,您也可以通過編程的方式對其進行實例化、配置、以及建立對象之間的連接)。下面是一些Cocoa用戶界面對象的實例:
windows
text fields
radio buttons
drawers
sheets
tab views
table views
browsers
pop-up lists
sliders
image views
color wells
combo boxes
scroll views
text views
steppers
此外,Cocoa還有一些支持用戶界面的技術,包括提高可訪問性、執行正當性檢查、以及連接用戶界面對象和定制對象需要的技術。
-
描畫和圖像處理—Cocoa帶有一個可以鎖定圖形焦點并將視圖(或視圖的一部分)標識為“變臟” 的框架,從而支持高效的定制視圖描畫。Cocoa中還有一些描畫貝齊爾(Bezier)路徑、執行遠交變換、合成圖像、以及創建不同圖像表示的編程工具類。
-
系統交互—Cocoa使您的應用程序可以和文件系統、工作空間、以及其它應用程序進行交互(或使用它們提供的服務)。
-
數據交換—Cocoa通過拷貝-粘貼、拖拽模型、以及Services菜單簡化了應用程序內部和應用程序之間的數據交換。
-
性能—為了增強應用程序的性能,Cocoa提供了多線程、空閑時間處理、資源的遲緩加載、內存管理、和運行環操作方面的編程支持。
-
基于文檔的應用程序—Cocoa為應用程序提供一種可以包含無限數量的文檔架構。每個文檔都包含在它自己的窗口中(比如一個字處理程序)。事實上,如果您選擇“Document-based application(基于文檔的應用程序)”工程類型,那么這類應用程序需要的很多組件就自動被創建了。
-
腳本處理—通過應用程序腳本能力信息和一組支持腳本的Cocoa類,您就可以使自己的應用程序具有腳本能力。也就是說,您的應用程序可以響應由AppleScript腳本發出的命令。應用程序也可以通過執行腳本或使用單獨的Apple Event來向其它應用程序發送命令,或者接受其它應用程序的命令。結果是每個具有腳本能力的應用程序都可以為用戶或其它應用程序提供服務。
-
國際化—Cocoa使用一種已經精化多年的方法來支持國際化和本地化。這種方法基于偏好語言的用戶列表,將本地化的資源放到應用程序的程序包(bundle)中。Cocoa還提供產生和訪問本地化字符串的工具和編程接口。而且,Cocoa中的文本操作缺省情況下是基于Unicode的,因此有利于程序的國際化。
-
Undo管理—您可以注冊一個用戶動作來和undo管理器協同工作,當用戶選擇合適的菜單項時,它們會處理undo(或redo)動作。Undo管理器通過獨立的棧來維護undo和redo操作。
-
文本—Cocoa提供了一個復雜的文本系統,使您可以進行從簡單到較為復雜的文本處理,簡單文本處理的一個例子是在文本視圖上顯示可編輯的文本,復雜的處理則比如字距和連字的控制、拼寫檢查、和嵌入圖像。
-
打印—和文本系統相類似,打印架構使您可以打印文檔和其它應用程序內容,并進行各種控制調整。在最簡單的級別上,您缺省可以打印各種視圖的內容;在較為復雜的級別上,您可以定義打印的內容和格式,控制一個打印作業如何進行,以及在打印面板上添加必要的視圖。
-
偏好設置—用戶缺省設置系統基于一個系統范圍內的數據庫,您可以將全局或應用程序特有的偏好設置存儲在這個數據庫中。
-
連網—Cocoa包含一個分布式對象(Distributed Objects)架構,它使一個Cocoa進程可以和相同或不同的計算機上的其它進程進行通訊。這個架構還提供將Bonjour能力集成到應用程序的編程接口。
-
多媒體—Cocoa提供了QuickTime視頻和基本音頻能力的支持。
?
開發環境
說Cocoa有它自己的開發環境并不十分精確。一個原因是程序員可以使用蘋果主要的開發工具—Xcode和Interface Builder—來開發Mac OS X其它應用程序環境的程序,比如Carbon;其次,開發Cocoa應用程序時完全不使用Xcode和Interface Builder也是可能的,比如,您可以使用Metrowerks的CodeWarrior來管理、編譯、和調試Cocoa工程;而且,如果您實在不愿意改變,也可以使用像Emacs這樣的文本編輯器來編寫代碼,用make file和命令行進行應用程序的連編,然后在命令行上通過gdb調試器來調試程序。
但是,Xcode和Interface Builder是開發Cooca軟件優先使用的工具。它們的起源正好和Cocoa是一致的,所以在工具和框架之間存在高度的兼容性。Xcode和Interface Builder一起,使設計、管理、連編、和調試Cocoa軟件工程變得非常容易。還有一個叫AppleScript Studio的工具,可以擴展應用程序的能力,您可以通過這個工具來創建具有腳本能力的Cocoa程序和通過AppleScript控制其它應用程序的程序。
本部分包含如下內容:
Xcode
Interface Builder
AppleScript Studio
其它開發工具
Xcode
Xcode是蘋果公司在Mac OS X下的集成開發環境(IDE)引擎。它負責處理從最開始到工程的最終部署這一過程中的大多數細節。您可以通過這個工具來完成如下工作:
-
創建和管理工程,包括指定目標的需求、依賴性、和連編的風格。
-
在具有語法染色、自動縮進等功能的編輯器上編寫源代碼。
-
在工程的不同組件中進行漫游和檢索,包括頭文件和文檔。
-
連編工程
-
在圖形化的源代碼級調試器上調試工程
Xcode可以連編由C、C++、Objective-C、Objective-C++、和Java編寫的源代碼組成的工程,可以生成Mac OS X支持的所有類型的執行代碼,包括命令行工具、框架、插件、內核擴展、程序包、和應用程序。Xcode允許您對連編和調試工具、可執行文件的打包方式(包括信息屬性列表和本地化程序包)、連編過程(包括拷貝文件、腳本文件處理、和其它連編階段)、以及用戶界面(包括分立和多視圖的代碼編輯器)進行幾乎無限的定制;還支持幾個源代碼管理系統(其中有CVS和Perforce),使您可以將文件追加到代碼庫、提交修改、獲取更新版本、以及進行版本的比較。
圖1-4顯示一個Xcode工程的實例。
?
圖1-4??Xcode中的TextEdit實例
?
Xcode特別適合用于Cocoa開發。在創建工程時,Xcode可以通過對應于Cocoa工程類型的工程模板,為您建立一個初始的開發環境。Cocoa工程類型有:應用程序(Objective-C或Java)、基于文檔的應用程序(Objective-C或Java)、工具、程序包、和框架。Xcode使用GNU C編譯器(gcc)來編譯Cocoa軟件,使用GNU源代碼級調試器(gdb)來調試軟件。在Cocoa開發中使用gcc和gdb從它還是NeXTSTEP(參見"一點歷史"部分)的時代就開始了。對Cocoa二進制代碼的編譯和調試經過多年的精化、擴展、和調優。
Xcode也有一個類瀏覽的功能,可以查看所有導入的Cocoa框架類和您自己的定制類,還有它們的繼承關系;從類瀏覽器中,您可以請求查看任何類的文檔。Xcode還包含一些設計工具,其中有一個工具可以用于設計Core Data程序中使用的數據實體的屬性和關系。
Xcode和另外一個主要的開發工具Interface Builder良好地集成在一起。在Interface Builder中,您可以定義一個類(包括超類,插座變量,和動作),并為工程中的每個類生成源代碼文件的框架。在Xcode中,您可以為定制類添加插座變量和動作,然后讓Interface Builder將這些實體導入到nib文件中。
請注意:簡單地說,插座變量(outlet)是一個對象和另一個對象的歸檔連接(表示為對象中的一個實例變量);動作則是當按鍵或滑塊這類對象被操作時,在被稱為目標(target)的對象(通常是一個定制對象)中被調用的方法。Interface Builder也會把目標對象和其它對象(稱為控件)之間的連接進行歸檔。
?
進一步閱讀:Xcode快速指南可以使您概覽Xcode,并為您提供其它開發工具文檔的連接。
?
Interface Builder
Cocoa工程的第二個主要開發工具是Interface Builder。顧名思義,Interface Builder是用于創建用戶界面的圖形工具。Interface Builder在Cocoa還是NeXTSTEP的時候就已經存在了,而且從那時侯起,它就作為同類軟件中的佼佼者而獲得廣泛的認可。很自然,它和Cocoa的結合是很緊密的。而且您也可以用它來為Carbon應用程序創建用戶界面。
Interface Builder以三個主要的設計元素為中心:
-
Nib文件。nib文件實際上是以檔案的形式對用戶界面中出現的對象進行文件包裝(一個封裝的目錄)。這種檔案本質上是一種對象圖,包含每個對象的信息,包括對象的尺寸及在其屏幕(如果是個窗口)或窗口內的位置信息。Cocoa應用程序中的Nib文件還包含定制類的代理引用和對象間連接信息,包括使用Cocoa綁定技術建立起來的連接。當您在Interface Builder中創建并保存一個用戶界面時,重建該界面需要的所有信息都會被存在nib文件中。nib文件還可以包含界面中使用的圖像和聲音文件。
Interface Builder將nib文件存儲在Cocoa工程中的一個本地化目錄下。在連編工程時,nib文件就會被拷貝到新建的程序包中對應的本地化目錄下(nib文件因此可以提供一種很好的用戶界面本地化方法)。 Cocoa應用程序缺省(也就是說Xcode會自動創建)有一個主nib文件,在運行時自動被裝載和顯示。主nib文件包含應用程序的主菜單,并可能有一個或多個窗口。您的應用程序可以根據需要裝載輔助的nib文件,比如文檔或預置窗口所在的文件。
Interface Builder將nib文件的內容表示在nib文件窗口中。您也可以在nib文件窗口中定義定制類及考察對象之間的連接。
-
選盤。 Interface Builder的選盤(Palette)窗口中包含多個面板,或者稱為“選盤”,每個選盤中包含一個彼此有關系的用戶界面對象的集合。將對象從選盤拖拽到恰當的位置上就可以創建用戶界面了,這里的位置可以是屏幕、窗口、各種視圖、或者主菜單(選盤對象自身不一定是可見的,但是必須以某種形式影響用戶界面)。當您將一個對象從選盤上拖出時,Interface Builder會實例化一個該對象的缺省實例。這個實例是一個真正的Cocoa對象,而不是運行時需要創建的實例的代理對象。如果您愿意的話,可以將您自己的定制對象放在選盤上。
-
查看器。 Interface Builder為用戶界面上的對象提供一個查看器(稱為Info窗口)。Info窗口由一系列可選擇的面板組成,用于設置對象的初始屬性和尺寸(雖然尺寸和很多屬性也可以直接進行操作)。其中的兩個面板用于建立對象之間的連接,一個基于插座變量和動作,另一個基于綁定技術。還有一個面板用于將定制類代替Application Kit框架中的超類。其它面板較為特殊,專用于建立用戶界面對象和幫助標簽及AppleScript事件處理器之間的關聯。
圖1-5顯示了一個在Interface Builder中打開的nib文件,以及支持窗口。
?
圖1-5??Interface Builder中TextEdit的預置窗口
?
用Interface Builder創建用戶界面的步驟比較直接:
將窗口或面板拖拽到屏幕上(面板等同于對話框或輔助窗口)。
設置窗口的初始(或固定的)位置、尺寸、和屬性。
將文本框、按鍵、表視圖控件、和彈出式列表等對象拖到窗口或之前放好的視圖對象上。
為這些對象設置初始(或固定的)位置、尺寸、和屬性。
為應用程序定義定制類。
您可以直接在Interface Builder中完成這個工作,或者將事先創建好的頭文件裝載到Interface Builder。在進行類的定制時,可以通過Interface Builder指定插座變量和動作。
在對象之間建立綁定和連接。這有兩種形式:
-
在應用程序的視圖、控制器、和模型對象之間建立綁定關系。
-
把插座變量連接到它們引用的對象,接著把動作連接到目標對象中合適的方法上。
Interface Builder有一個功能,可以在設計的各個階段測試界面(定制的行為除外)。
為您定義的各個定制類創建頭文件和源代碼文件,這些文件會出現在關聯的Xcode工程上。
Interface Builder還包含一個功能:在對一個擺好位置的對象進行移動或調整其尺寸時,會通過一些短暫出現的藍線來顯示當前位置是否遵循Aqua人機界面指南,包括推薦的尺寸、對齊、與用戶界面上的其它對象或窗口邊界的相對位置。
進一步閱讀:有關用戶界面開發工具的進一步信息,請參見Interface Builder部分。此外,"Nib文件"部分給出了nib文件及其在應用程序中如何被使用的更多信息。您還可以參考"對象之間的通訊"部分,以概要了解插座變量、目標-動作機制、以及Cocoa綁定技術。
?
AppleScript Studio
多年來,Mac OS一直有一個定義良好的特性,就是用戶可以通過由AppleScript語言寫成的腳本控制應用程序。很多用戶發現這個特性是不可或缺的,因為它可以將涉及多個應用程序的復雜操作序列串接在一起。AppleScript的能力在Mac OS X系統上更進了一步。AppleScript Studio是一種開發技術,用于創建通過AppleScript腳本控制復雜用戶界面的Cocoa程序。
AppleScript Studio把來自AppleScript、Xcode、Interface Builder、和Cocoa的各種元素結合起來,提供了一個創建AppleScript解決方案的開發環境。您可以通過它來制作應用程序,完成如下任務:
-
執行AppleScript腳本
-
控制應用程序的界面
-
控制具有腳本能力的應用程序或操作系統中支持腳本的部分
由于AppleScript Studio將AppleScript和Xcode、Interface Builder、和Cocoa集成在一起,腳本編程者可以利用這些組件各自的優勢和能力。他們可以從Interface Builder選盤中拖出一組豐富的用戶界面對象,根據個人的喜好進行定制;可以得到內置的Aqua用戶界面指南的支持;還能夠連編和維護帶有多個目標和連編步驟的的復雜工程。
這個開發環境使我們有可能通過腳本對Script Editor程序(它是創建AppleScript腳本的傳統工具)不能提供的能力進行控制,這些能力包括:
-
創建任意大的腳本
-
在腳本中進行檢索和替代
-
單步腳本調試,支持各種執行方式
-
方便訪問腳本中的處理函數和屬性
-
靈活的字典查看器,和應用程序的腳本用語一起使用。
進一步閱讀:更多信息請參見AppleScript Studio編程指南。
?
其它開發工具
雖然Xcode和Interface Builder是開發Cocoa應用程序的主要工具,但是還有許多工具可以使用。在一些應用程序開發階段中,您可能會找到很多輔助的應用程序和命令行工具。
這個部分將回顧一些輔助性的開發工具并簡短地討論一些命令行工具,然而命令行工具的數量太多,即使對它們進行一個濃縮的總結也超出了本文的范圍。您的最好選擇就是訪問/usr/bin和/usr/sbin目錄下各種工具的使用手冊(man頁面),只要在Terminal外殼下鍵入man命令,后面跟著命令名稱就可以了。在/Developer/Tools目錄下還有一些蘋果開發的命令行工具。
性能工具
下面這些應用程序用于軟件性能的測量和分析。它們位于/Developer/Applications目錄下。
-
Sampler?用于分析程序運行時的行為和內存分配。顧名思義,Sampler會按一定的時間周期對程序的函數調用棧進行采樣,并在采樣結束時向您顯示調用頻率最高的函數或方法。這種信息有助于定位消耗大量CPU時間或進行內存分配的函數或方法。
-
ObjectAlloc?用于跟蹤各種程序的內存分配與釋放行為。這種歷史數據可以顯示重復的內存分配行為和總體的分配趨勢。對于Objective-C代碼,ObjectAlloc在記錄alloc調用的同時,也記錄每個copy、retain、release、autorelease調用,而且還記錄在Core Foundation中與這些方法相對應的函數,以及malloc(及相關)函數進行的內存分配。
-
MallocDebug?按分配時的調用棧順序顯示程序中當前已分配的內存塊。通過這個工具一下子就可以看到您的應用程序消耗多少內存、這些內存是從哪里分配的、以及哪些函數分配了大量的內存。MallocDebug還可以找出在程序中分配的、卻沒有被引用的內存,因此可以幫助您發現內存泄露并跟蹤這些泄露的內存是在哪里分配的。
-
QuartzDebug?是一個幫助您對應用程序的顯示機制進行調試的工具,對大量進行描畫和圖像處理的應用程序特別有用。QuartzDebug包括如下幾個調試選項:
-
自動閃爍描畫模式,這種模式會在每個描畫操作之后閃爍一下圖形上下文。
-
在更新屏幕區域之前先用黃色對該區域進行描畫的模式。
-
用于取得整個系統的窗口列表的靜態快照,同時給出每個窗口的擁有者及該窗口消耗多少內存的選項。
-
- Thread Viewer?顯示一個進程中各個線程的活動。這個工具顯示每個線程的活動時間線,動作在時間線上用不同的顏色表示。點擊時間線可以得到與點擊位置相對應的活動回溯樣本。
還有一些命令行工具可以用于性能分析,比如:
-
top,對當前正在運行的進程進行采樣統計并顯示統計結果。
-
gprof,用于產生程序的執行輪廓
-
fs_usage,顯示文件系統訪問的統計信息
還有其它很多命令行工具可以用于性能分析。有關Cocoa應用程序開發可以用哪些性能分析工具以及性能分析的概念、技術、和策略的更多信息,請參見性能編程主題(Performance Programming Topics)文檔。
請注意:性能概述對Mac OS X的性能工具進行討論。
?
其它工具
您還可以發現下面的工具對Cocoa應用程序開發很有用(位于/Developer/Applications目錄下):
?
- Icon Composer和Icns Browser?您可以用Icon Composer來導入各種格式的圖像,創建應用程序圖標和文檔圖標的圖標文件;還可以用Icns Browser程序來創建不同尺寸、位深度、和位掩碼的圖標變體。
?
?
- FileMerge?這個工具可以可視化地“diffs” 各種文本文件(比如源代碼文件、頭文件、和屬性列表),并具有選擇合并的能力。
?
?
- Package Maker?通過Installer程序為應用程序(其它類型的軟件)制作安裝包。
?
?
- Property List Editor?這是一個編輯器,用于創建和編輯XML及較老風格的屬性列表。
Cocoa框架
是什么因素使一個程序成為Cocoa程序呢?肯定不是編程語言,因為在Cocoa開發中您可以使用各種語言;也不是開發工具,因為您在命令行上就可以創建Cocoa程序(雖然那會使開發過程變得復雜,且需要消耗大量時間)。那么,所有Cocoa程序的共同點是什么?是什么使它們變得與眾不同?答案是這些程序都是由一些對象組成,而這些對象最終都是從NSObject這個根類繼承下來的;還有,這些程序都是基于Objective-C運行環境的。這個說法對于所有的Cocoa框架來說也是正確的。
請注意:上面的說法還需要做一點限制。首先,Cocoa還有另一個根類,即NSProxy。只是NSProxy很少用于Cocoa編程。其次,您可以創建您自己的根類,只是這需要很多工作(包括編寫與Objective-C運行環境進行交互的代碼),而且為此花費時間可能是不值得的。
Mac OS X包含多個Cocoa框架,蘋果和第三方廠商也隨時會發布更多的框架。無論Cocoa框架有多么豐富,有兩個框架總是與眾不同:即Foundation和Application Kit框架,它們是核心的Cocoa框架。如果您沒有連接并使用Application Kit框架中的類,就不能開發任何類型的Cocoa軟件;同樣地,如果您沒有連接并使用Foundation框架中的類,也不能開發任何類型的Cocoa軟件(當您連接Cocoa雨傘框架的時候,Xcode會自動連接這些框架)。Foundation和Application Kit框架在Cocoa開發中是必要的,其它框架則是輔助和可選的。
下面的部分將討論上述兩個核心的Cocoa框架,并簡要描述一些輔助性的框架。為了使這些大框架更加容易理解,在介紹Foundation和Application Kit框架時,我們將每個層次中的數十個類分為不同的功能組。雖然這種分組方式有很強的邏輯基礎,但是人們也可以按其它方式合理地進行分組。
本部分包含如下內容:
Foundation
Application Kit
帶有Cocoa API的其它框架
?
Foundation
Foundation框架定義了一些基礎類,可以用于各種類型的Cocoa程序。Foundation框架和Application Kit框架的區分標準在于用戶界面。如果一個對象既不出現在用戶界面上,也不是專門用于支持用戶界面,那么它就屬于Foundation框架。您可以僅用Foundation框架創建一個Cocoa程序,而不涉及其它框架;命令行工具和Internet服務器就是這樣的例子。
蘋果公司在設計Foundation框架時牢記如下目標:
-
為諸如內存管理、對象改變、和通告這樣的事物定義基本的對象行為和引入一致的規則。
-
通過程序包技術和Unicode字符串(和其它技術一起)支持國際化和本地化。
-
支持對象的持久保存。
-
支持對象的分發。
-
在一定程度上獨立于操作系統,以支持移植。
-
為編程的元類型提供對象封裝或等價物,比如數值、字符串、和集合,以及為訪問底層系統實體和服務提供工具類,比如端口、線程、和文件系統。
Cocoa應用程序定義為需要連接Application Kit框架,同時也總是必須連接Foundation框架的程序。這兩個類層次都共用同一個根類,即NSObject類,很多(如果不是絕大多數的話)Application Kit的方法和函數都將Foundation對象作為參數或返回值。一些Foundation類可能看起來像是為應用程序設計的,NSUndoManager和NSUserDefaults類就是其中的兩個例子,但是由于它們沒有涉及到用戶界面,所以被包含在Foundation框架中。
Foundation的范式和策略
Foundation為Cocoa編程引入了幾個范式和策略,以保證程序中的對象在特定的環境下具有一致的行為和期望。包括:
-
對象的所有權和對象的清除。Foundation建立了一個對象所有權策略,用以代替垃圾收集機制。該策略指定對象需要釋放自己創建、拷貝、或顯式保留的其它對象。NSObject(類和協議)定義了保留和釋放對象的方法。自動釋放池(在NSAutoreleasePool類中定義)實現了一種遲緩釋放(delayed-release)機制,使Cocoa程序在處理不由調用者負責的返回對象上有一個一致的規則。
-
可變類的變體。在Foundation中,很多值和容器類的不可變類都有一個可以修改的變體,可變類總是不可變類的子類。如果您需要動態地改變一個經過封裝的值,或者改變這種對象的所屬關系,可以創建一個可變類的實例。由于它是從相應的不可變類繼承下來的,所以您可以在接受不可變類型參數的方法中傳入可變類的實例。對象可變性的更多信息請參見"對象的可變性"部分。
-
類簇。類簇是一個抽象類及一組私有的具體子類的組合,抽象類是這些子類的雨傘接口。根據不同的上下文(特別是創建對象所用的方法),類簇可以為您返回恰當的、經過優化的類實例。舉例來說,NSString和NSMutableString就是針對不同的存儲需要進行優化的各種私有子類實例的經紀類。多年來,具體類進行了幾次修改,但應用程序依然可以工作。類簇的更多信息請參見"類簇"部分。
-
通告。通告是Cocoa的主要設計模式。它基于廣播機制,該機制使一個對象(稱為觀察者)可以在另一個對象進行某種任務或遇到某種情況時,以用戶或系統事件的方式得到通告。產生通告的對象可能并不知道通告觀察者的存在或身份。有幾種類型的通告:同步、異步、和分布式通告。Foundation的通告機制由NSNotification、NSNotificationCenter、NSNotificationQueue、和NSDistributedNotificationCenter類實現的。更多關于通告的信息請參見"通告"部分。
Foundation類
Foundation類層次的根是NSObject類,它(和NSObject及NSCopying協議一起)定義了基本的對象屬性和行為。更多有關NSObject和基本對象行為的信息請參見"根類"部分。
Foundation框架的剩余部分由幾組相互關聯的類和一些獨立的類組成。有一些代表基本數據類型的類,如字符串、字節數組、用于存儲其它對象的集合類;一些代表系統信息的類,如日期類;還有一些代表系統實體的類,比如端口、線程、和進程。圖1-6、圖1-7、和圖1-8所示的類層次描述了這些類的邏輯分組及其繼承關系。
圖1-6??Foundation類層次—Objective-C(第一部分)
圖1-7??Foundation類層次—Objective-C(第二部分)
圖1-8??Foundation類層次—Objective-C(第三部分)
上面這些框圖按照如下范疇(和下文提到的其它關聯關系)將Foundation框架中的類進行邏輯分類:
-
值對象。值對象封裝了各種類型的數據,提供對數據進行訪問和各種操作的途徑。因為它們都是對象,所以可以對它們(和它們包含的數值)進行歸檔和分發。NSData類為字節流提供面向對象的存儲空間,而NSValue和NSNumber類則為簡單的標量值數組提供面向對象的存儲空間。NSDate、NSCalendarDate、NSTimeZone、NSCalendar、NSDateComponents、和?NSLocale類提供代表時間、日期、日歷、和地域設置(locales)的對象。它們包含的方法可以用于計算日期和時間差、以各種格式顯示日期和時間、以及調整世界上各個位置時間和日期。
-
字符串。NSString是另一類值對象,負責為以null結尾的、具有特定編碼的字節數組提供面向對象的存儲空間。它支持對UTF-16、UTF-8、MacRoman、和很多其它編碼的字符串之間進行轉換。NSString還提供對字符串進行檢索、組合、和比較、以及對文件系統路徑進行操作的方法。您可以用NSScanner對象來對NSString對象中的數字和詞進行解析。NSCharacterSet(顯示在框圖中的集合類部分)代表可以在各個NSString和NSScanner方法中使用的一組字符。
-
集合。集合是以一定的順序存儲和訪問其它對象(通常是數值)的對象。NSArray的索引從0開始,NSDictionary使用鍵-值對,而NSSet則負責對象的隨機存儲(NSCountedSet類使集合具有唯一標識)。通過NSEnumerator對象,您可以訪問一個集合中的元素序列。集合對象是屬性列表的必要元素,和其它所有對象一樣,它也可以被歸檔和分發。
-
操作系統服務。 很多Foundation類為訪問各種底層的操作系統服務提供便利,同時又把開發者從操作系統的具體特性隔離開來。舉例來說,您可以通過NSProcessInfo類查詢應用程序運行的環境;通過NSHost類得到主機系統在網絡中的名稱和地址;通過NSTimer對象,您可以按指定的時間間隔向其它對象發送消息;NSRunLoop可以幫您管理應用程序或其它類型程序的輸入源;而NSUserDefaults則為存儲全局(主機級別)和用戶級缺省值(預置)的系統數據庫提供編程接口。
-
文件系統和URL。?NSFileManager為諸如創建、重命名、刪除、和移動文件這樣的文件操作提供統一的接口。NSFileHandle則可以進行較為底層的文件操作(比如文件內查找操作)。NSBundle可以尋找存儲在程序包中的資源,可以動態裝載某些資源(比如nib文件和代碼)。您可以用NSURL和NSURLHandle類來表示、訪問、和管理源于URL的數據。
-
進程間通訊。 這個范疇中的大部分類代表不同的系統端口、套接字、和名字服務器,對實現底層的IPC很有用。NSPipe代表一個BSD管道,即一種進程間的單向通訊通道。
-
線程和子任務。?NSThread類使您可以創建多線程的程序,而各種鎖(lock)類則為彼此競爭的線程在訪問進程資源時提供各種控制機制。通過NSTask,您的程序可以分出一個子進程來執行其它工作或進行進度監控。
-
- 通告。請見"Foundation的范式和策略"部分中的有關通告類總結。
- 歸檔和序列化。這個范疇中的類使對象分發和持久保留成為可能。NSCoder及其子類和NSCoding協議一起,可以以獨立于架構的方式來表示對象中包含的數據,可以將類信息和數據一起存儲。
-
表達式和條件判斷。條件判斷類,即NSPredicate、NSCompoundPredicate、和NSComparisonPredicate類,負責對獲取或過濾對象的邏輯約束條件進行封裝。NSExpression對象則代表條件判斷中的表達式。
-
Spotlight查詢。NSMetadataItem、NSMetadataQuery和相關的查詢類對文件系統的元數據進行封裝,使元數據的查詢成為可能。
-
Objective-C語言服務。NSException和NSAssertionHandler類為代碼中的斷言和例外處理提供了面向對象的封裝。NSInvocation對象是Objective-C消息的靜態表示,您的程序可以對它存儲,并在之后用于激活另一個對象的消息。undo管理器(NSUndoManager)和分布式對象(Distributed Objects)系統都用到了這種對象。NSMethodSignature對象負責記錄方法的類型信息,可以用于信息的推送。NSClassDescription則是一個抽象類,用于定義和查詢類的關系和屬性。
-
腳本。這個范疇中的類可以幫助您實現對AppleScript腳本和Apple Event命令的支持。
-
分布式對象。 您可以通過分布式對象類來進行同一臺電腦或一個網絡中的不同電腦上的進程間通訊。其中的兩個類-NSDistantObject和NSProtocolChecker的根類(NSProxy)和Cocoa其它部分的根類不同。
-
網絡。NSNetService和NSNetServiceBrowser類支持稱為Bonjour的零配置網絡架構。Bonjour是在IP網絡上發布和瀏覽服務的強大系統。
Application Kit
Application Kit框架包含實現圖形的、事件驅動的用戶界面需要的所有對象:窗口、對話框、按鍵、菜單、滾動條、文本輸入框—這個列表還在不斷增加。Application Kit幫助您處理所有的細節,它可以高效地進行屏幕描畫、和營建設備及屏幕緩沖區進行通訊,在描畫之前清除屏幕上的區域,以及對視圖進行裁剪。Application Kit框架中的類數量咋一看好像很嚇人,但是大多數的Application Kit類都是支持類,您不必直接使用。您還可以選擇在哪個級別上使用Application Kit:
-
使用Interface Builder創建從用戶界面對象到應用程序控制器對象的連接,控制器對象負責管理用戶界面,協調用戶界面和內部數據結構之間的數據流。為此,您可能會用到off-the-shelf控制器對象(用于Cocoa綁定),可能需要實現一個或更多的定制控制器類—特別是使用那些類的動作和委托方法。舉例來說,您需要實現一個方法,使之在用戶選擇某個菜單項時被調用(如果該菜單項沒有可接受的缺省實現的話)。
-
以編程的方式控制用戶界面,這需要對Application Kit的類和協議更加熟悉。舉例來說,支持用戶將圖標從一個窗口拖拽到另一個窗口需要一些編程工作,而且熟悉NSDragging...?協議。
-
通過子類化NSView或其它類實現您自己的對象。在子類化NSView時,需要用圖形函數來編寫自己的描畫函數。子類化要求對Application Kit的工作機制有更深的理解。
Application Kit概述
Application Kit由超過125個類和協議組成。所有的類最終都從Foundation框架的NSObject類繼承而來。圖1-9和圖1-10的框圖顯示了Application Kit類的繼承關系。
圖1-9??Application Kit的類層次—Objective-C(第一部分)
圖1-10??Application Kit的類層次—Objective-C(第二部分)
如您所看到的那樣,Application Kit的類層次樹既寬又淺,類層次中最深的類從根類開始只有五個超類,而大多數類的層次都淺得多。類層次中的一些主要分支特別有意思。
Application Kit中最大分支的根是NSResponder類,它負責定義響應者鏈,即對用戶事件進行響應的有序對象列表。當用戶進行按鍵或鼠標點擊時,系統就會產生一個事件,并沿著響應者鏈向上傳遞,尋找可以響應該事件的對象。任何處理事件的對象都必須繼承自NSResponder類。核心的Application Kit類—NSApplication、NSWindow、和NSView—都繼承自NSResponder。閱讀"核心應用程序架構"部分可以得到有關響應者類的更多信息。
Application Kit類的第二大分支繼承自NSCell類。值得注意的是,這組類和NSControl類(繼承自NSView)的派生類有大體上的映像關系。對于負責響應用戶動作的用戶界面對象,Application Kit采用的架構將它們的工作分為控件(control)對象和單元(cell)對象。NSControl和NSCell類以及它們的子類定義了一組常見的用戶界面對象,比如按鍵(button)、滑塊(slider)、和瀏覽器(browser),用戶可以通過圖形化的操作控制應用程序的某些方面。大多數的控件對象和一個或多個單元對象相關聯,單元對象負責實現描畫細節和事件的處理。舉例來說,一個按鍵是由一個NSButton對象和一個NSButtonCell對象構成的,進一步的信息請參見"控件和單元架構"部分。
控件和單元的實現機制基于Application Kit的一個重要設計模式:目標-動作(target-action)機制。單元對象可以保留用戶點擊(或在單元上進行某種動作)時應該發送給特定對象的消息標識信息。當用戶操作一個控件時(比如用鼠標點擊控件),控件就從它的單元對象抽出必要的信息,并向目標對象發送動作消息。目標-動作機制使您可以指定目標對象及應該調用的方法,從而賦予用戶動作某種意義。您通常可以使用Interface Builder來對目標和動作進行設置,只要按住Control鍵,同時將鼠標指針從控件對象拖拽到應用程序或其它對象就可以了。您也可以通過編程的方式來設置目標和動作。
Application Kit中另一個基于設計模式的機制是委托(delegation)機制。用戶界面上的很多對象,比如文本框和表視圖,都定義了委托。委托對象代表被委托對象進行各種動作,或者與之相互協作,因此可以在用戶界面操作中實現特定的應用程序邏輯。有關委托、目標-動作、以及Application Kit的其它范式和機制的更多信息,請參見"和對象進行通訊"部分。有關這些范式和機制的基礎設計模式的討論,請參見"Cocoa的設計模式"部分。
下面部分將簡要地描述Application Kit的某些能力及其架構的某些方面,還有一些類和協議。在描述時按照圖1-9和圖1-10所示的類層次圖對類進行分組。
通用的用戶界面類
在用戶界面的總體功能方面,Application Kit提供了如下幾個類:
-
全局應用程序對象。 每個應用程序都使用一個NSApplication類的單件實例來控制主事件循環、跟蹤應用程序的窗口和菜單、將事件分發給恰當的對象(即應用程序本身或者它的一個窗口)、建立高級別的自動釋放池、以及接收應用程序級別的事件通告。NSApplication對象有一個委托對象(由您來分配),在應用程序啟動或終止、被隱藏或被激活、即將打開用戶選擇的文件等的時候,委托對象會得到通知。通過設置NSApplication對象的委托對象并實現相應的委托方法,您就可以定制應用程序的行為,而不必生成NSApplication的子類。"核心應用程序架構"部分對這個單件應用程序對象進行詳細的討論。
-
窗口和視圖。窗口和視圖類,即NSWindow和NSView,繼承自NSResponder類,可以對用戶動作進行響應。NSApplication對象內維護著一個NSWindow對象的列表—應用程序的每個窗口都有一個對應的對象,而每個NSWindow對象都維護一些具有一定層次結構的NSView對象。視圖層次用于窗口內部的描畫和事件處理。NSWindow對象負責處理窗口級別的事件,將其它事件分發給窗口中的視圖對象,并為視圖對象提供一個描畫區域。NSWindow對象也有一個委托,用于定制窗口的行為。
NSView是顯示在窗口中的所有對象的超類。所有的NSView子類都需要借助圖形函數來實現自己的描畫方法;drawRect:是一個基本方法,在創建新的NSView時,需要重載這個方法。
"核心應用程序架構"部分也對NSView和NSWindow對象進行描述。
-
Cocoa綁定的控制器類。NSController是一個抽象類,它的具體子類有NSObjectController、?NSArrayController、和NSTreeController,它們是Cocoa綁定實現的一部分。這個技術可以自動同步存儲在對象中的應用程序數據和該數據在用戶界面上的表現。有關這些類型的控制器對象的描述請參見"模型-視圖-控制器設計模式"?部分。
-
面板(對話框)。NSPanel是NSWindow的子類,用于顯示一些短暫的、全局的、或緊急的信息。舉例來說,您可以使用一個NSPanel(而不是NSWindow)的實例來顯示錯誤信息,或請求用戶對特殊或不正常的情況進行響應。Application Kit為您實現一些常用的對話框,比如Save、Open、和Print對話框,用于保存、打開、和打印文檔。將這些對話框用于各種應用程序的公共操作,可以給用戶一個統一的觀感。
-
菜單和光標。NSMenu、NSMenuItem、和NSCursor類負責定義應用程序顯示給用戶的菜單和光標的行為和外觀。
-
分組和滾動視圖。?NSBox、NSScrollView、和NSSplitView類用于為窗口中的視圖集合或其它視圖對象提供圖形“附件”。您可以通過NSBox類將窗口中的元素分組,并為整組元素描畫一個邊界。NSSplitView類可以在垂直或水平方向附加一些視圖,并為每個視圖分配一定的公共區域,用戶可以通過滑動控制條來重新分配視圖的區域。NSScrollView類及其輔助類,NSClipView,為用戶提供一個滾動機制,以及讓用戶初始化和控制滾動的圖形對象。NSRulerView類則可以為一個滾動視圖添加標尺和標志。
-
表視圖和大綱視圖。NSTableView類以行列的方式顯示數據。NSTableView可以很好地(但不僅限于)用于顯示數據庫記錄,在這種場合下,一行對應于一條記錄,列則包含記錄屬性。用戶可以對單獨的單元進行編輯,以及重新排列各個列。您可以通過設置委托和數據源對象來控制NSTableView對象的行為和內容。大綱視圖(即NSOutlineView的實例,是NSTableView的子類)提供了另一種顯示表格數據的方法。通過NSBrowser類,您可以為用戶創建一個顯示和漫游層次數據的對象。
文本和字體
NSTextField類實現了一個簡單的可編輯文本輸入框,NSTextView類則為更大的文本體提供更為廣泛的編輯特性。
NSTextView是抽象類NSText的子類,定義了擴展文本系統的接口。NSTextView支持富文本、添附文件(圖形文件及其它)、輸入管理和按鍵綁定、以及標識文本屬性,可以和Font窗口及Font菜單、標尺及段落風格、Serivces工具、還有剪貼板(Clipboard)等組件互相協作。NSTextView還允許通過委托和通告來進行定制—您很少需要從NSTextView派生出子類,也很少需要以編程的方式創建NSTextView的實例,因為Interface Builder選盤上的一些對象,比如NSTextField、NSForm、和NSScrollView,已經包含了NSTextView對象了。
通過NSTextStorage、NSLayoutManager、NSTextContainer、和其它相關的類,還可能實現更為強大、更具創造力的文本操作(比如在一個圓里進行文本編輯)。Cocoa文本系統還支持列表、表格、和非連續的文本選擇。
NSFont和NSFontManager類用于封裝和管理字體的家族、尺寸、和變體。對于每種不同的字體,NSFont類定義一個對象與之對應。這些對象都可以表示很多數據,為了提高效率,它們可以在應用程序中的所有對象之間共享。NSFontPanel類定義了在用戶界面上顯示的Font窗口。
圖形和顏色
NSImage和NSImageRep負責封裝圖形數據,您可以通過這些類輕松而高效地訪問存儲在磁盤文件或顯示在屏幕上的圖像。每個NSImageRep的子類都知道如何描畫特定類型的源數據代表的圖像。NSImage類可以為一個圖像提供多種表示,還實現了諸如緩存這樣的行為。Cocoa的圖像處理和描畫的能力都集成在Core Image框架中。
Cocoa的顏色處理由NSColor、NSColorSpace、NSColorPanel、NSColorList、NSColorPicker、和NSColorWell類來支持。NSColor和NSColorSpace類支持一組豐富的顏色格式和表示,包括定制顏色。其它類大多是接口類,負責定義和顯示的面板及視圖,使用戶可以選擇和應用顏色。舉例來說,用戶可以將顏色從Color窗口拖拽到任意的顏色井(color well)。NSColorPicking協議可以用于擴展標準的Color窗口。
NSGraphicsContext、NSBezierPath、和NSAffineTransform類可以實現向量描畫,支持圖形變換,比如縮放、旋轉、和轉換等。
打印和傳真
NSPrinter、NSPrintPanel、NSPageLayout、和NSPrintInfo類一起,可以將顯示在窗口或視圖上信息進行打印和傳真,還可以創建NSView的PDF表示。
文檔和文件系統支持
NSFileWrapper類用于創建與磁盤文件或目錄相對對應的對象。NSFileWrapper將文件的內容保留在內存中,以便對其進行顯示、修改、以及將它傳輸給其它應用程序。它還提供一個圖標,用于拖拽該文件或將文件表示為附件。您也可以通過Foundation框架中的NSFileManager類來訪問或枚舉文件和目錄內容。NSOpenPanel和NSSavePanel類還提供了便利和熟悉的文件系統界面。
NSDocumentController、NSDocument、和NSWindowController類為創建基于文檔的應用程序定義了一個架構(在類的層次框圖中,NSWindowController類顯示在用戶界面組中)。這類程序可以生成包含方式相同、但具有獨特排布方式的數據,這些數據可以存儲在文件中。在保存、打開、復原、關閉、以及管理這些文檔方面,它們具有一些內置或易于得到的能力。
國際化和字符輸入支持
如果一個應用程序要在世界其它地方使用,則可能需要根據語言、國家、或文化地域對其資源進行定制或本地化。舉例來說,一個應用程序可能需要有獨立的日語、英語、法語、和德語版本的字符串、圖標、nib文件、或上下文幫助。特定語言的資源文件被存放在程序包目錄下的一個子目錄下(就是那些帶有.lproj擴展名的目錄)。您通常可以通過Interface Builder來建立本地化資源文件。有關Cocoa國際化支持的更多信息,請參見"Nib文件和其它應用程序資源"部分。
NSInputServer類、NSInputManager類、和NSTextInput協議一起,為您的應用程序提供訪問文本輸入管理系統的通道。該系統負責對不同國際化鍵盤產生的按鍵進行解釋,并將正確的文本字符或Control-key事件遞送給文本視圖對象(通常由文本類和這些類進行交互,您不必介入)。
操作系統服務
下面這些Application Kit類為您的應用程序提供操作系統支持:
-
和其它應用程序共享數據。?NSPasteboard類定義了剪貼板,可以存儲從應用程序拷貝出來的數據,并使其它希望使用該數據的應用程序可以訪問。NSPasteboard實現了大家熟悉的剪切-拷貝-粘貼操作。通過剪貼板,NSServicesRequest協議為應用程序間的數據傳遞定義一種基于注冊服務的通訊機制(剪貼板在用戶界面上實現為Clipboard)。
-
拖拽。只需要少量的編程工作,定制的視圖對象就可以被拖拽到任意地方。只要遵循NSDragging...協議,對象就可以變成拖拽機制的一部分;可拖拽的對象遵循NSDraggingSource協議,而目的對象(拖拽對象的接受者)則遵循NSDraggingDestination協議。Application Kit隱藏了所有的光標跟蹤和拖拽圖像顯示的細節。
-
拼寫檢查。您可以通過NSSpellServer類來定義一個拼寫檢查服務,并將它作為服務提供給其它應用程序。通過NSSpellChecker類可以將您的應用程序連接到拼寫檢查服務上。NSIgnoreMisspelledWords和NSChangeSpelling協議用于支持拼寫檢查機制。
Interface Builder支持
NSNibConnector類是一個抽象類,它和兩個具體子類NSNibControlConnector和NSNibOutletConnector一起,表示Interface Builder上的連接。NSNibControlConnector負責管理Interface Builder中的動作連接,NSNibOutletConnector則管理插座變量連接。
帶有Cocoa API的其它框架
作為標準的Mac OS X安裝的一部分,蘋果系統中還包含(除了Foundation和Application Kit框架外)一些使用Cocoa編程接口的框架(它們也可能使用Carbon或其它類型的編程接口)。您可以通過這些輔助性的框架來為應用程序實現一些期望但不是必須的能力。這些重要的輔助性框架包括:
?
?
- Core Data—Core Data框架可以幫助應用程序管理模型對象圖的整個生命周期,包括關系數據庫或平坦文件中數據的持久存儲。該框架還包括一些其它特性,比如undo和redo的管理、值的自動正當性檢查、將對象的狀態改變通知其它對象、以及與Cocoa綁定的集成。
?
?
- Sync Services—用Sync Services可以將聯系人、日歷和書簽結構、還有您自己的應用程序數據同步起來。您還可以擴展現有的結構。
?
?
- Address Book—這個框架為聯系人和其它個人信息實現了一個中心數據庫。使用Address Book框架的應用程序可以和其它應用程序分享這些聯系信息,包括蘋果的Mail和iChat。
?
?
- Preference Panes—您可以通過這個框架來創建應用程序動態裝載的插件,實現用于錄入用戶偏好設置的用戶界面。這個框架可以應用到您自己或系統級的應用程序。
?
?
- Screen Saver—Screen Saver框架可以幫助您創建Screen Effects模塊,該模塊可以通過系統預置(System Preferences)程序來裝載和運行。
?
- Web Kit—Web Kit框架中提供一組在窗口中顯示萬維網內容的核心類。它缺省實現了一些功能,比如顯示用戶點擊的連接。
一點歷史
Cocoa在很多年前被稱為NeXTSTEP。NeXT電腦公司在1989年開發并發布了NeXTSTEP的1.0版本,并在之后不久推出2.0和3.0版本(分別在1990和1992年)。在這個早期的階段,NEXTSTEP更像一個應用程序環境;這個說法指的是整個操作系統,包括窗口和圖像處理系統(基于Display PostScript)、Mach內核、設備驅動程序等等。
在那個時候還沒有Foundation框架。事實上根本就沒有框架。相反,軟件庫(動態共享)被稱為工具箱,那些工具箱中最突出的就是Application Kit。現在Foundation框架中的很多工作都實現為函數、結構、常量、和其它類型。Application Kit自身有一組比現在小得多的類。圖1-11顯示的就是NeXTSTEP 0.9 (1988)的類層次圖。
圖1-11??1988年的Application Kit類層次
除了Application Kit,早期的NeXTSTEP還包含Sound Kit和Music Kit,這些庫中包含一組豐富的Objective-C類,通過這些類可以對Display Postscript層進行高級別的訪問,實現音頻和音樂合成。
在1993年早期,NeXTSTEP 3.1被移植(并發售)到Intel、Sparc、和Hewlett-Packard計算機上。NeXTSTEP 3.3也標志了一個新的大方向,因為它包含了Foundation的初級版本。大約在這個時間(1993),OpenStep的創建者也采用了表單(form)。OpenStep是Sun和NeXT的合作產物,目的是將高級別的NeXTSTEP(特別是Application Kit和Display PostScript)移植到Solaris系統上。名字中的“Open” 指的是兩個公司聯合發布的開放API規范。官方的OpenStep API在1994年9月發布,它第一次將API分割為Foundation和Application Kit,并且第一次使用“NS”的前綴。
在1996年6月,NeXT已經移植并發售了OpenStep 4.0版本,可以運行在Intel、Sparc、和Hewlett-Packard 計算機上,同時還有一個可以運行在Windows系統上的OpenStep運行環境。Sun也完成了OpenStep在Solaris系統上的移植,并將它作為網絡對象計算環境(Network Object Computing Environment)的一部分發售。但是OpenStep一直沒有成為Sun公司總體策略的重要部分。
蘋果公司在1997年收購NeXT Software公司(那時的叫法)的時候,OpenStep變成一個Yellow Box,并包含在Mac OS X Server(也稱為Rhapsody)和Windows系統上。之后,隨著Mac OS X策略的演化,它最終將名字改為“Cocoa”。
轉載于:https://www.cnblogs.com/StarMud/articles/2557254.html
總結
- 上一篇: 车机屏幕适配方案总结
- 下一篇: java报错symbol_java 报错