Cocoa

Cocoa是蘋果公司為macOS所創建的原生面向對象的應用程序接口，是Mac OS X上五大API之一（其它四個是Carbon、POSIX、X11和Java）。
Cocoa應用程序一般在蘋果公司的開發工具Xcode（前身為Project Builder）和Interface Builder上用Objective-C寫成。不過，通過Java bridge、PasCocoa、PyObjC、CamelBones以及RubyCocoa等橋接技術，Java、Clozure CL、LispWorks、Object Pascal、Python、Perl、Ruby等其它工具或者語言也可以用來開發Cocoa應用。也有一些其它語言的Cocoa實現無須橋接，比如蘋果公司開發的MacRuby和類似Lisp的Nu語言。不使用Xcode和Interface Builder，僅僅通過文本編輯器、GCC和GNU make工具也可以用Objective-C語言開發Cocoa應用。
對最終用戶來說，使用Cocoa編程環境開發的應用程序即為Cocoa應用程式。這類應用有獨特的外觀，因為Cocoa編程環境讓程序在多方面自動遵循蘋果公司的人機界面守則。

**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繼承的類可以響應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框架管理了全部的繪圖操作，例如裁剪，滾動，縮放等，程序員可以不再重複實現基礎的功能，而可以集中於提供程序的關鍵功能上。

**模型-視圖-控制器**
施樂帕羅奧多研究中心的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類，可以提供自動的撤銷/重做支持。

**Rich objects**
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。

**參考文獻**
 Aaron Hillegass: Cocoa Programming for Mac OS X, Addison-Wesley, 3rd Edition 2008, Paperback, ISBN 0-321-50361-9.- Stephen Kochan: Programming in Objective-C, Sams, 1st Edition 2003, Paperback, ISBN 0-672-32586-1.- Michael Beam, James Duncan Davidson: Cocoa in a Nutshell, O'Reilly, 1st Edition 2003, Paperback, ISBN 0-596-00462-1.- Erick Tejkowski: Cocoa Programming for Dummies, 1st Edition 2003, Paperback, ISBN 0-7645-2613-8.- Simson Garfinkel, Michael K. Mahoney: Building Cocoa Applications : A Step by Step Guide, O'Reilly, 1st Edition 2002, Paperback, ISBN 0-596-00235-1.- James Duncan Davidson: Learning Cocoa with Objective-C, O'Reilly, 2nd Edition 2002, Paperback, ISBN 0-596-00301-3.- Scott Anguish, Erik M. Buck, Donald A. Yacktman: Cocoa Programming, Sams, 1st Edition 2002, Paperback, ISBN 0-672-32230-7.- Bill Cheeseman: Cocoa Recipes for Mac OS X, Peachpit Press, 1st Edition 2002, Paperback, ISBN 0-201-87801-1.- Andrew Duncan: Objective-C Pocket Reference, O'Reilly, 1st Edition 2002, Paperback, ISBN 0-596-00423-0.- Apple Inc.: Learning Cocoa, O'Reilly, 1st Edition 2001, Paperback, ISBN 0-596-00160-6.

**外部鏈接**
  Apple的Cocoa文檔-  iDevApps - Cocoa編程論壇-  CocoaDev-  Cocoa Dev Centraldate=20110208041602