Cocoa
Cocoa是蘋(píng)果公司為Mac OS X所創(chuàng)建的原生面向?qū)ο蟮腁PI,是Mac OS X上五大API之一(其它四個(gè)是Carbon、POSIX、X11和Java)。 蘋(píng)果的面向?qū)ο箝_(kāi)發(fā)框架,用來(lái)生成 Mac OS X 的應(yīng)用程序。主要的開(kāi)發(fā)語(yǔ)言為 Objective-c, 一個(gè)c 的超集。 Cocoa 開(kāi)始于1989年9月上市的NeXTSTEP 1.0,當(dāng)時(shí)沒(méi)有Foundation框架,只有動(dòng)態(tài)運(yùn)行庫(kù), 稱為 kit, 最重要的是AppKit. 1993 年 NeXTSTEP 3.1 被移植到了 Intel, Sparc, HP 的平臺(tái)上,Foundation 首次被加入,同時(shí)Sun 和 NeXT 合作開(kāi)發(fā)OpenStep 也可以運(yùn)行在Windows 系統(tǒng)上。 Cocoa 應(yīng)用程序一般在蘋(píng)果公司的開(kāi)發(fā)工具Xcode(前身為Project Builder)和Interface Builder上用Objective-C寫(xiě)成。不過(guò),通過(guò)Java bridge、PasCocoa、PyObjC、CamelBones以及RubyCocoa等橋接技術(shù),Java、Clozure CL、LispWorks、Object Pascal、Python、Perl、Ruby等其它工具或者語(yǔ)言也可以用來(lái)開(kāi)發(fā) Cocoa 應(yīng)用。也有一些其它語(yǔ)言的Cocoa實(shí)現(xiàn)無(wú)須橋接,比如蘋(píng)果公司開(kāi)發(fā)的MacRuby和類(lèi)似Lisp的Nu語(yǔ)言。不使用Xcode和Interface Builder,僅僅通過(guò)文本編輯器、GCC和GNU make工具也可以用Objective-C語(yǔ)言開(kāi)發(fā)Cocoa應(yīng)用。 對(duì)最終用戶來(lái)說(shuō),使用Cocoa編程環(huán)境開(kāi)發(fā)的應(yīng)用程序即為Cocoa 應(yīng)用。這類(lèi)應(yīng)用有獨(dú)特的外觀,因?yàn)镃ocoa編程環(huán)境讓程序在多方面自動(dòng)遵循蘋(píng)果公司的人機(jī)界面守則。
目錄
1發(fā)展歷史
2開(kāi)發(fā)過(guò)程
3動(dòng)態(tài)綁定
4內(nèi)存管理
5主要框架
6基礎(chǔ)對(duì)象
7實(shí)現(xiàn)
1發(fā)展歷史編輯
更多資料:Mac OS X歷史 Cocoa 是從1980年代由 NeXT 開(kāi)發(fā)的編程環(huán)境?NeXTSTEP 和 OPENSTEP 演變而來(lái),這點(diǎn)可由其類(lèi)別之名皆以 NS 前綴(代表NeXTSTEP)看出端倪。蘋(píng)果電腦公司在1996年12月收購(gòu)了NeXT。開(kāi)發(fā) NeXTSTEP 和 OPENSTEP 的大量工作都轉(zhuǎn)化到了 Mac OS X 中,最顯而易見(jiàn)的部分當(dāng)屬 Cocoa。但差異也存在。例如,NeXTSTEP 和 OPENSTEP 使用 Display Postscript 實(shí)現(xiàn)文字和圖形的屏幕顯示,而 Cocoa 依賴蘋(píng)果的 Quartz(基于 PDF 的繪圖模型)。 Cocoa 這個(gè)名詞曾經(jīng)被用來(lái)稱呼一款幫助兒童創(chuàng)建多媒體工程的應(yīng)用程序。隨后該應(yīng)用停產(chǎn)。該名稱被用作現(xiàn)在的用途。2開(kāi)發(fā)過(guò)程編輯
施樂(lè)帕羅奧多研究中心的Smalltalk開(kāi)發(fā)小組最終發(fā)明了一種可以簡(jiǎn)化開(kāi)發(fā)過(guò)程,提高代碼重用率的設(shè)計(jì)哲學(xué),即“模型-視圖-控制器”模式(MVC)。這種模式將應(yīng)用程序分為三個(gè)可以交互的對(duì)象集,即模型,視圖和控制器。其中,模型類(lèi)代表原始數(shù)據(jù),例如文檔、設(shè)置、文件、內(nèi)存中的對(duì)象等,視圖是模型中數(shù)據(jù)的可視化表現(xiàn),而控制器類(lèi)則包含了將模型和其對(duì)應(yīng)視圖連接起來(lái)的邏輯,并保持前二者的狀態(tài)同步。 Cocoa的設(shè)計(jì)遵循了嚴(yán)格的MVC原則。在OpenStep下,絕大多數(shù)的類(lèi)要么是高層的視圖類(lèi)(AppKit),或者是相對(duì)底層的模型類(lèi)(Foundation)。與類(lèi)似的MVC系統(tǒng)相比,OpenStep沒(méi)有強(qiáng)的模型層,例如它不包含表示“文檔”的存儲(chǔ)類(lèi)。在向Cocoa遷移的過(guò)程中,模型層被大大擴(kuò)展了,引入了一系列的類(lèi),它們提供了一些桌面程序所需的常用功能。 在Mac OS X 10.3中,蘋(píng)果引入了NSController系列類(lèi)以提供預(yù)定義的控制器層。這些類(lèi)是Cocoa綁定系統(tǒng)的一部分,該系統(tǒng)也允許使用類(lèi)似鍵-值-觀測(cè)器和鍵-值-綁定協(xié)議來(lái)對(duì)其進(jìn)行擴(kuò)展。其中,“綁定”的概念表明兩個(gè)對(duì)象(通常是視圖和控制器)之間的關(guān)系。綁定使得開(kāi)發(fā)者可以集中于定義這種關(guān)系,而不是編寫(xiě)大量的“膠水代碼”來(lái)實(shí)現(xiàn)這些關(guān)系。 在Mac OS X 10.4中,蘋(píng)果引入了Core Data框架,進(jìn)一步擴(kuò)展了這種概念。Core Data標(biāo)準(zhǔn)化了對(duì)更改的追蹤和模型層的保存行為。因此,該框架大大簡(jiǎn)化了改變應(yīng)用程序數(shù)據(jù),撤銷(xiāo)更改,在磁盤(pán)中保存和讀取數(shù)據(jù)的過(guò)程。 通過(guò)提供對(duì)MVC模型中全部3層的框架支持,蘋(píng)果的目的在于減少程序員所需編寫(xiě)的“膠水代碼”量,以解放這些資源而用于程序的真正特性。3動(dòng)態(tài)綁定編輯
在多數(shù)面向?qū)ο蟮木幊陶Z(yǔ)言中,調(diào)用方法是由直接調(diào)用內(nèi)存中一段固定的代碼實(shí)現(xiàn)的。由于這種方法需要預(yù)定義的處理命令的類(lèi),因而限制了程序的設(shè)計(jì),通常采用責(zé)任鏈模式作為其設(shè)計(jì)模式。雖然Cocoa在多數(shù)地方仍然采用這種方式,但通過(guò)Objective-C的動(dòng)態(tài)綁定特性增加了更多設(shè)計(jì)的自由性。 在Objective-C中,消息由selector所代表,其為描述需要調(diào)用的方法的一個(gè)字符串。在發(fā)送消息時(shí),該selector被送入Objective-C運(yùn)行時(shí)中,在可用方法列表中尋找對(duì)應(yīng)的方法,然后調(diào)用該方法的實(shí)際實(shí)現(xiàn)。由于selector只是文本數(shù)據(jù),因此它可以保存在文件中,通過(guò)網(wǎng)絡(luò)或在進(jìn)程間傳輸,或以其它方式進(jìn)行操作。方法的實(shí)現(xiàn)是在運(yùn)行時(shí)查找的,而非編譯時(shí)。這樣的做法會(huì)造成一些性能損失,但動(dòng)態(tài)綁定允許相同的selector代表不同的實(shí)現(xiàn)。 利用這些特性,Cocoa提供了一種通用的數(shù)據(jù)管理技術(shù),稱為鍵-值編碼(KVC)。這種技術(shù)允許對(duì)象的數(shù)據(jù)或?qū)傩钥梢栽谶\(yùn)行時(shí)通過(guò)其鍵名進(jìn)行查找,其中,屬性的名稱即為其值的鍵名。在靜態(tài)語(yǔ)言中,這樣的做法是不可能的。KVC大大的增加了設(shè)計(jì)的自由度:通過(guò)KVC,無(wú)需知道對(duì)象的類(lèi)型即可訪問(wèn)其屬性或數(shù)據(jù)。另外,利用鍵-值-觀測(cè)器(KVO)技術(shù)和NSUndoManager類(lèi),可以提供自動(dòng)的撤銷(xiāo)/重做支持。4內(nèi)存管理編輯
Cocoa環(huán)境的一個(gè)特點(diǎn)是它可以管理動(dòng)態(tài)分配的內(nèi)存。Cocoa中絕大部分類(lèi)的基類(lèi)都是NSObject,它實(shí)現(xiàn)了引用計(jì)數(shù)的內(nèi)存管理模型。從NSObject繼承的類(lèi)可以響應(yīng)retain和release消息,以增減其引用計(jì)數(shù);也可以通過(guò)發(fā)送retainCount消息來(lái)獲取其引用計(jì)數(shù)。一個(gè)以alloc?,copy或Objective-C 2.0中增加的new所創(chuàng)建的對(duì)象的引用計(jì)數(shù)為1;向?qū)ο蟀l(fā)送retain消息會(huì)將計(jì)數(shù)加1,而發(fā)送release消息則會(huì)將計(jì)數(shù)減1。若對(duì)象的引用計(jì)數(shù)減少到了0,則它會(huì)被銷(xiāo)毀。dealloc消息類(lèi)似于C++中的析構(gòu)函數(shù),在對(duì)象被銷(xiāo)毀之前可能會(huì)被調(diào)用,但系統(tǒng)不保證會(huì)發(fā)送該消息。這種引用計(jì)數(shù)的模型與微軟的COM中的IUnknown接口特性十分相似,它提供了AddRef和Release接口,與retain和release對(duì)應(yīng)。 從Objective-C 2.0開(kāi)始,Objective-C運(yùn)行時(shí)實(shí)現(xiàn)了可選的垃圾收集器。若垃圾收集的特性被激活,則運(yùn)行時(shí)會(huì)將引用計(jì)數(shù)相關(guān)的操作,例如“retain”和“release”,變?yōu)闊o(wú)操作。iOS上的Objective-C 2.0實(shí)現(xiàn)中不包含垃圾收集器。垃圾收集器運(yùn)行在一個(gè)低優(yōu)先級(jí)的后臺(tái)線程中,并可以在用戶動(dòng)作時(shí)暫停,從而保持良好的用戶體驗(yàn)。5主要框架編輯
Cocoa包含兩個(gè)主要的Objective-C對(duì)象庫(kù),稱為“框架”。框架的功能類(lèi)似于動(dòng)態(tài)庫(kù),即可以在運(yùn)行時(shí)動(dòng)態(tài)的載入應(yīng)用程序的地址空間,但框架作為一個(gè)捆綁 (計(jì)算機(jī))而非獨(dú)立文件,其中除了可執(zhí)行代碼外,也包含了資源,頭文件和文檔。 “Foundation工具包”,或簡(jiǎn)稱為“Foundation”,首先出現(xiàn)在OpenStep中。在Mac OS X中,它是基于Core Foundation的。作為通用的面向?qū)ο蟮暮瘮?shù)庫(kù),Foundation提供了字符串,數(shù)值的管理,容器及其枚舉,分布式計(jì)算,事件循環(huán),以及一些其它的與圖形用戶界面沒(méi)有直接關(guān)系的功能。其中用于類(lèi)和常數(shù)的“NS”前綴來(lái)自于Cocoa的來(lái)源,NeXTSTEP。它可以在Mac OS X和iOS中使用。 “應(yīng)用程序工具包”,或稱AppKit(Application?Kit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序與圖形用戶界面交互所需的代碼。它是基于Foundation建立的,也使用“NS”前綴。它只能在Mac OS X中使用。 “用戶界面工具包”,或稱UIKit(User?Interface?Kit),是用于iOS的圖形用戶界面工具包。與AppKit不同,它使用“UI”的前綴。 Cocoa構(gòu)架的一個(gè)關(guān)鍵部分是其多樣的視圖模型。總體而言,它是基于由Quartz提供的PDF繪制模型的,該特性允許使用PostScript繪制自定義圖形內(nèi)容,同時(shí)也自動(dòng)的支持了打印機(jī)以及類(lèi)似設(shè)備。由于Cocoa框架管理了全部的繪圖操作,例如裁剪,滾動(dòng),縮放等,程序員可以不再重復(fù)實(shí)現(xiàn)基礎(chǔ)的功能,而可以集中于提供程序的關(guān)鍵功能上。6基礎(chǔ)對(duì)象編輯
Cocoa中最有用的特性是系統(tǒng)提供的強(qiáng)大的“基礎(chǔ)對(duì)象”,例如Foundation中的NSString和NSAttributedString類(lèi),提供了Unicode字符串的支持;而AppKit中的NSText系統(tǒng)則允許程序員在GUI中放置字符串對(duì)象。 NSText及其相關(guān)類(lèi)是用于顯示和編輯字符串的。這些對(duì)象允許程序?qū)崿F(xiàn)簡(jiǎn)單的單行文本框,也可以實(shí)現(xiàn)完整的多頁(yè),多欄文本顯示方案 ,方案同時(shí)可以提供支持完整的專(zhuān)業(yè)排版特性,例如壓縮字符,合字,環(huán)繞形狀的文字,旋轉(zhuǎn),完整的Unicode支持和反鋸齒字形渲染。段落格式可以自動(dòng)控制或由用戶自定義;可以使用內(nèi)建的“ruler”對(duì)象附加到任何文本視圖上。這些類(lèi)也有自動(dòng)拼寫(xiě)檢查特性,該特性使用一個(gè)由所有程序共享的字典。另外,也允許無(wú)限制數(shù)量的撤銷(xiāo)/重做操作。只使用內(nèi)建的特性,任何人都可以只用不到10行代碼寫(xiě)出一個(gè)具備上述特性的文本編輯器,而若使用Cocoa綁定,甚至可以不用寫(xiě)一行代碼。 若需要對(duì)已有特性進(jìn)行擴(kuò)展,Objective-C中的類(lèi)別特性使得這項(xiàng)操作變得相當(dāng)容易。通過(guò)類(lèi)別可以直接對(duì)已有類(lèi)進(jìn)行功能添加,而無(wú)需對(duì)其進(jìn)行更改或獲得其源代碼。一般而言,這樣的目的需要通過(guò)繼承原有的類(lèi)并修改原有的代碼,將原有的類(lèi)以新的子類(lèi)代替來(lái)完成。7實(shí)現(xiàn)編輯
Cocoa 本身由 Objective-C 語(yǔ)言寫(xiě)成,因此 Objective-C 是開(kāi)發(fā) Cocoa 應(yīng)用的首選語(yǔ)言。雖然也提供 Java 到 Cocoa 的綁定,但是在開(kāi)發(fā)者中并未得到廣泛采用。而且,由于使用橋接機(jī)制,Java 的綁定并不能全面利用 Cocoa 的所有功能。2005年,蘋(píng)果公司宣布 Java 的 Cocoa 綁定在 Mac OS X 10.4 和之后版本中屬被廢棄的技術(shù)。換句話說(shuō),Cocoa API 中可能會(huì)逐漸出現(xiàn)不支援 Java 的功能。 作為 Xcode 一部分的 AppleScript Studio 工具允許用戶和開(kāi)發(fā)者用 AppleScript 編寫(xiě)一些簡(jiǎn)單的 Cocoa 應(yīng)用。第三方實(shí)現(xiàn)的綁定有 Clozure CL、LispWorks、PyObjC (Python)、RubyCocoa (Ruby)、CamelBones (Perl)、Cocoa#、Monobjc (C#) 和 NObjective(C#)。Nu 語(yǔ)言直接使用 Objective-C 的對(duì)象模型,所以無(wú)須綁定就可以調(diào)用 Cocoa API。 也有開(kāi)源項(xiàng)目把 Cocoa 的大部分在其它操作系統(tǒng)上實(shí)現(xiàn)(包括 Windows),從而使開(kāi)發(fā)跨平臺(tái)的 Cocoa 應(yīng)用成為可能。比如 GNUStep 和 Cocotron。總結(jié)
- 上一篇: 操作系统:动态分区存储(首次适应算法、最
- 下一篇: React组件通信-父子组件间的通信