發展曆史
更多資料:Mac OS X曆史
Cocoa 是從1980年代由 NeXT 開發的 編程環境 NeXTSTEP 和 OPENSTEP 演變而來,這點可由其類别之名皆以 NS 前綴(代表NeXTSTEP)看出端倪。蘋果電腦公司在1996年12月收購了NeXT。開發 NeXTSTEP 和 OPENSTEP 的大量工作都轉化到了 Mac OS X 中,最顯而易見的部分當屬 Cocoa。但差異也存在。例如,NeXTSTEP 和 OPENSTEP 使用 Display Postscript 實現文字和圖形的屏幕顯示,而 Cocoa 依賴蘋果的 Quartz(基于 PDF 的繪圖模型)。
Cocoa 這個名詞曾經被用來稱呼一款幫助兒童創建多媒體工程的應用程序。随後該應用停産。該名稱被用作現在的用途。
開發過程
施樂帕羅奧多研究中心的Smalltalk開發小組最終發明了一種可以簡化開發過程,提高代碼重用率的設計哲學,即“模型-視圖-控制器”模式(MVC)。這種模式将應用程序分為三個可以交互的對象集,即模型,視圖和控制器。其中,模型類代表 原始數據,例如文檔、設置、文件、内存中的對象等,視圖是模型中數據的可視化表現,而控制器類則包含了将模型和其對應視圖連接起來的邏輯,并保持前二者的狀态同步。
Cocoa的設計遵循了嚴格的MVC原則。在OpenStep下,絕大多數的類要麼是高層的視圖類(AppKit),或者是相對底層的模型類(Foundation)。與類似的MVC系統相比,OpenStep沒有強的模型層,例如它不包含表示“文檔”的存儲類。在向Cocoa遷移的過程中,模型層被大大擴展了,引入了一系列的類,它們提供了一些桌面程序所需的常用功能。
在Mac OS X 10.3中,蘋果引入了NSController系列類以提供預定義的控制器層。這些類是Cocoa綁定系統的一部分,該系統也允許使用類似鍵-值-觀測器和鍵-值-綁定協議來對其進行擴展。其中,“綁定”的概念表明兩個對象(通常是視圖和控制器)之間的關系。綁定使得開發者可以集中于定義這種關系,而不是編寫大量的“膠水代碼”來實現這些關系。
在Mac OS X 10.4中,蘋果引入了Core Data框架,進一步擴展了這種概念。Core Data标準化了對更改的追蹤和模型層的保存行為。因此,該框架大大簡化了改變應用程序數據,撤銷更改,在磁盤中保存和讀取數據的過程。
通過提供對MVC模型中全部3層的框架支持,蘋果的目的在于減少程序員所需編寫的“膠水代碼”量,以解放這些資源而用于程序的真正特性。
動态綁定
在多數 面向對象的編程語言中,調用方法是由直接調用内存中一段固定的代碼實現的。由于這種方法需要預定義的處理命令的類,因而限制了程序的設計,通常采用責任鍊模式作為其設計模式。雖然Cocoa在多數地方仍然采用這種方式,但通過Objective-C的動态綁定特性增加了更多設計的自由性。
在Objective-C中,消息由
selector所代表,其為描述需要調用的方法的一個字符串。在發送消息時,該selector被送入Objective-C運行時中,在可用方法列表中尋找對應的方法,然後調用該方法的實際
實現。由于selector隻是文本數據,因此它可以保存在文件中,通過網絡或在進程間傳輸,或以其它方式進行操作。方法的實現是在運行時查找的,而非編譯時。這樣的做法會造成一些性能損失,但 動态綁定允許相同的selector代表不同的實現。
利用這些特性,Cocoa提供了一種通用的 數據管理技術,稱為
鍵-值編碼(KVC)。這種技術允許對象的數據或屬性可以在運行時通過其鍵名進行查找,其中,屬性的名稱即為其值的鍵名。在靜态語言中,這樣的做法是不可能的。KVC大大的增加了設計的自由度:通過KVC,無需知道對象的類型即可訪問其屬性或數據。另外,利用
鍵-值-觀測器(KVO)技術和NSUndoManager類,可以提供自動的撤銷/重做支持。
内存管理
Cocoa環境的一個特點是它可以管理動态分配的内存。Cocoa中絕大部分類的 基類都是NSObject,它實現了 引用計數的内存管理模型。從NSObject繼承的類可以響應retain和release消息,以增減其引用計數;也可以通過發送retainCount消息來獲取其引用計數。一個以 alloc ,copy或Objective-C 2.0中增加的new所創建的對象的引用計數為1;向對象發送retain消息會将計數加1,而發送release消息則會将計數減1。
若對象的引用計數減少到了0,則它會被銷毀。dealloc消息類似于C++中的 析構函數,在對象被銷毀之前可能會被調用,但系統不保證會發送該消息。這種 引用計數的模型與微軟的COM中的IUnknown接口特性十分相似,它提供了AddRef和Release接口,與retain和release對應。
從Objective-C 2.0開始,Objective-C運行時實現了可選的垃圾收集器。若垃圾收集的特性被激活,則運行時會将引用計數相關的操作,例如“retain”和“release”,變為無操作。iOS上的Objective-C 2.0實現中不包含垃圾收集器。垃圾收集器運行在一個低優先級的後台線程中,并可以在用戶動作時暫停,從而保持良好的用戶體驗。
主要框架
Cocoa包含兩個主要的Objective-C對象庫,稱為“框架”。框架的功能類似于動态庫,即可以在運行時動态的載入應用程序的 地址空間,但框架作為一個捆綁 (計算機)而非獨立文件,其中除了 可執行代碼外,也包含了資源,頭文件和文檔。
“Foundation工具包”,或簡稱為“Foundation”,首先出現在OpenStep中。在Mac OS X中,它是基于Core Foundation的。作為通用的 面向對象的函數庫,Foundation提供了字符串,數值的管理,容器及其枚舉,分布式計算,事件循環,以及一些其它的與 圖形用戶界面沒有直接關系的功能。其中用于類和常數的“NS”前綴來自于Cocoa的來源,NeXTSTEP。它可以在Mac OS X和iOS中使用。
“應用程序工具包”,或稱AppKit(
Application
Kit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序與圖形用戶界面交互所需的代碼。它是基于Foundation建立的,也使用“NS”前綴。它隻能在Mac OS X中使用。
“用戶界面工具包”,或稱UIKit(User Interface Kit),是用于iOS的 圖形用戶界面工具包。與AppKit不同,它使用“UI”的前綴。
Cocoa構架的一個關鍵部分是其多樣的視圖模型。總體而言,它是基于由Quartz提供的PDF繪制模型的,該特性允許使用PostScript繪制自定義圖形内容,同時也自動的支持了打印機以及類似設備。由于Cocoa框架管理了全部的繪圖操作,例如裁剪,滾動,縮放等,程序員可以不再重複實現基礎的功能,而可以集中于提供程序的關鍵功能上。
基礎對象
Cocoa中最有用的特性是系統提供的強大的“基礎對象”,例如Foundation中的NSString和NSAttributedString類,提供了Unicode字符串的支持;而AppKit中的NSText系統則允許程序員在GUI中放置字符串對象。
NSText及其相關類是用于顯示和編輯字符串的。這些對象允許程序實現簡單的單行文本框,也可以實現完整的多頁,多欄文本顯示方案 ,方案同時可以提供支持完整的專業排版特性,例如壓縮字符,合字,環繞形狀的文字,旋轉,完整的Unicode支持和反鋸齒字形渲染。
段落格式可以自動控制或由用戶自定義;可以使用内建的“ruler”對象附加到任何文本視圖上。這些類也有自動拼寫檢查特性,該特性使用一個由所有 程序共享的字典。另外,也允許無限制數量的撤銷/重做操作。隻使用内建的特性,任何人都可以隻用不到10行代碼寫出一個具備上述特性的 文本編輯器,而若使用Cocoa綁定,甚至可以不用寫一行代碼。
若需要對已有特性進行擴展,Objective-C中的類别特性使得這項操作變得相當容易。通過類别可以直接對已有類進行功能添加,而無需對其進行更改或獲得其 源代碼。一般而言,這樣的目的需要通過繼承原有的類并修改原有的代碼,将原有的類以新的子類代替來完成。
實現
Cocoa 本身由 Objective-C 語言寫成,因此 Objective-C 是開發 Cocoa 應用的首選語言。雖然也提供 Java 到 Cocoa 的綁定,但是在開發者中并未得到廣泛采用。而且,由于使用 橋接機制,Java 的綁定并不能全面利用 Cocoa 的所有功能。2005年,蘋果公司宣布 Java 的 Cocoa 綁定在 Mac OS X 10.4 和之後版本中屬被廢棄的技術。換句話說,Cocoa API 中可能會逐漸出現不支援 Java 的功能。
作為 Xcode 一部分的 AppleScript Studio 工具允許用戶和開發者用 AppleScript 編寫一些簡單的 Cocoa 應用。第三方實現的綁定有 Clozure CL、LispWorks、PyObjC (Python)、RubyCocoa (Ruby)、CamelBones (Perl)、Cocoa#、Monobjc (C#) 和NObjective(C#)。Nu 語言直接使用 Objective-C 的對象模型,所以無須綁定就可以調用 Cocoa API。
也有 開源項目把 Cocoa 的大部分在其它操作系統上實現(包括 Windows),從而使開發跨平台的 Cocoa 應用成為可能。比如 GNUStep 和 Cocotron。