Cocoa

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
Cocoa
開發者蘋果公司
程式語言C, C++, Objective-C, Swift
作業系統macOS
類型軟體框架
許可協定專有
網站developer.apple.com

Cocoa蘋果公司macOS所建立的原生物件導向應用程式介面,是Mac OS X上五大API之一(其它四個是CarbonPOSIXX11Java)。

Cocoa應用程式一般在蘋果公司的開發工具Xcode(前身為Project Builder英語Project Builder)和Interface Builder上用Objective-C寫成。不過,通過Java bridge、PasCocoa英語PasCocoaPyObjC英語PyObjCCamelBones英語CamelBones以及RubyCocoa英語RubyCocoa等橋接技術,JavaClozure CLLispWorks英語LispWorksObject PascalPythonPerlRuby等其它工具或者語言也可以用來開發Cocoa應用。也有一些其它語言的Cocoa實現無須橋接,比如蘋果公司開發的MacRuby英語MacRuby和類似LispNu語言。不使用Xcode和Interface Builder,僅僅通過文字編輯器、GCCGNU make工具也可以用Objective-C語言開發Cocoa應用。

對終端使用者來說,使用Cocoa編程環境開發的應用程式即為Cocoa應用程式。這類應用有獨特的外觀,因為Cocoa編程環境讓程式在多方面自動遵循蘋果公司的人機介面守則英語Human interface guidelines

Cocoa歷史[編輯]

Cocoa是從1980年代由NeXT開發的編程環境NeXTSTEP和OPENSTEP演變而來,這點可由其類別之名皆以NS前綴(代表NeXTSTEP)看出端倪。蘋果電腦公司在1996年12月收購了NeXT。開發NeXTSTEP和OPENSTEP的大量工作都轉化到了Mac OS X中,最顯而易見的部分當屬Cocoa。但差異也存在。例如,NeXTSTEP和OPENSTEP使用Display PostScript實現文字和圖形的螢幕顯示,而Cocoa依賴蘋果的Quartz(基於PDF的繪圖模型)。

Cocoa這個名詞曾經被用來稱呼一款幫助兒童建立多媒體工程的應用程式。隨後該應用停產。該名稱被用作現在的用途。

記憶體管理[編輯]

Cocoa環境的一個特點是它可以管理動態分配的記憶體。Cocoa中絕大部分類的基礎類別都是NSObject,它實現了參照計數的記憶體管理模型。從NSObject繼承的類可以回應retainrelease訊息,以增減其參照計數;也可以通過傳送retainCount訊息來取得其參照計數。一個以alloccopyObjective-C 2.0中增加的new所建立的對象的參照計數為1;向對象傳送retain訊息會將計數加1,而傳送release訊息則會將計數減1。若對象的參照計數減少到了0,則它會被銷毀。dealloc訊息類似於C++中的解構函式,在對象被銷毀之前可能會被呼叫,但系統不保證會傳送該訊息。這種參照計數的模型與微軟COM中的IUnknown介面特性十分相似,它提供了AddRefRelease介面,與retainrelease對應。

Objective-C 2.0開始,Objective-C執行時實現了可選的垃圾收集器。若垃圾收集的特性被啟用,則執行時會將參照計數相關的操作,例如「retain」和「release」,變為無操作iOS上的Objective-C 2.0實現中不包含垃圾收集器。垃圾收集器執行在一個低優先級的後台執行緒中,並可以在使用者動作時暫停,從而保持良好的使用者體驗。[1]

主要框架[編輯]

Cocoa包含三個主要的Objective-C對象庫,稱為「框架」。框架的功能類似於動態庫,即可以在執行時動態的載入應用程式的位址空間,但框架作為一個捆綁而非獨立檔案,其中除了可執行代碼外,也包含了資源,標頭檔和文件。

  • 使用者介面工具包」,或稱UIKit(User Interface Kit),是用於iOS的圖形化使用者介面工具包。與AppKit不同,它使用「UI」的字首。

Cocoa構架的一個關鍵部分是其多樣的視圖模型。總體而言,它是基於由Quartz提供的PDF繪製模型的,該特性允許使用PostScript繪製自訂圖形內容,同時也自動的支援了印表機以及類似裝置。由於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只是文字資料,因此它可以儲存在檔案中,通過網路或在行程間傳輸,或以其它方式進行操作。方法的實現是在執行時尋找的,而非編譯時。這樣的做法會造成一些效能損失[2],但動態繫結允許相同的selector代表不同的實現。

利用這些特性,Cocoa提供了一種通用的資料管理技術,稱為鍵-值編碼(KVC)[3]。這種技術允許對象的資料或屬性可以在執行時通過其鍵名進行尋找,其中,屬性的名稱即為其值的鍵名。在靜態語言中,這樣的做法是不可能的。KVC大大的增加了設計的自由度:通過KVC,無需知道對象的類型即可訪問其屬性或資料。另外,利用鍵-值-觀測器(KVO)技術和NSUndoManager類,可以提供自動的復原/重做支援[4]

Rich objects[編輯]

Cocoa中最有用的特性是系統提供的強大的「基礎對象」,例如Foundation中的NSStringNSAttributedString類,提供了Unicode字串的支援;而AppKit中的NSText系統則允許程式設計師在GUI中放置字串對象。

NSText及其相關類是用於顯示和編輯字串的。這些對象允許程式實現簡單的單行文字方塊,也可以實現完整的多頁,多欄文字顯示方案 ,方案同時可以提供支援完整的專業排版特性,例如壓縮字元英語Kerning合字,環繞形狀的文字,旋轉,完整的Unicode支援和反鋸齒字形彩現。段落格式可以自動控制或由使用者自訂;可以使用內建的「ruler」對象附加到任何文字視圖上。這些類也有自動拼寫檢查特性,該特性使用一個由所有程式共享的字典。另外,也允許無限制數量的復原/重做操作。只使用內建的特性,任何人都可以只用不到10行代碼寫出一個具備上述特性的文字編輯器,而若使用Cocoa繫結,甚至可以不用寫一行代碼。

若需要對已有特性進行擴充,Objective-C中的類別特性使得這項操作變得相當容易[5]。通過類別可以直接對已有類進行功能添加,而無需對其進行更改或獲得其原始碼。一般而言,這樣的目的需要通過繼承原有的類並修改原有的代碼,將原有的類以新的子類代替來完成。

實現[編輯]

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應用成為可能。比如GNUstepCocotron[6]

參考文獻[編輯]

  1. ^ Apple Computer, Inc. Leopard Technology Series for Developers: Objective-C 2.0 Overview. Developer.apple.com. 2007-11-06 [2010-05-30]. (原始內容存檔於2010-07-24). 
  2. ^ Wikibooks - Some Objective-C advantages. [2010-10-16]. (原始內容存檔於2010-11-15). 
  3. ^ Key-Value Coding Programming Guide. [2010-10-16]. (原始內容存檔於2013-05-04). 
  4. ^ Key-Value Observing Programming Guide[永久失效連結]
  5. ^ Categories and Extensions. [2010-10-16]. (原始內容存檔於2009-08-26). 
  6. ^ Cocotron頁面存檔備份,存於網際網路檔案館) - Cocoa的免費版本

外部連結[編輯]