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