Cocoa

Cocoa是蘋果公司為macOS所建立的原生面向物件的應用程式介面，是Mac OS X上五大API之一。Cocoa應用程式一般在蘋果公司的開發工具Xcode和Interface Builder上用Objective-C寫成。不過，透過Java bridge、、、以及等橋接技術，Java、Clozure CL、、Object Pascal、Python、Perl、Ruby等其它工具或者語言也可以用來開發Cocoa應用。也有一些其它語言的Cocoa實現無須橋接，比如蘋果公司開發的和類似Lisp的Nu語言。不使用Xcode和Interface Builder，僅僅透過文字編輯器、GCC和GNU make工具也可以用Objective-C語言開發Cocoa應用。對終端使用者來說，使用Cocoa程式設計環境開發的應用程式即為Cocoa應用程式。這類應用有獨特的外觀，因為Cocoa程式設計環境讓程式在多方面自動遵循蘋果公司的。Cocoa歷史.Cocoa是從1980年代由NeXT開發的程式設計環境NeXTSTEP和OPENSTEP演變而來，這點可由其類別之名皆以NS字首。Cocoa這個名詞曾經被用來稱呼一款幫助兒童建立多媒體工程的應用程式。隨後該應用停產。該名稱被用作現在的用途。記憶體管理.Cocoa環境的一個特點是它可以管理動態分配的記憶體。Cocoa中絕大部分類的基類都是NSObject，它實現了引用計數的記憶體管理模型。從NSObject繼承的類可以響應codice_1和codice_2訊息，以增減其引用計數；也可以透過傳送codice_3訊息來獲取其引用計數。一個以codice_4，codice_5或Objective-C 2.0中增加的codice_6所建立的物件的引用計數為1；向物件傳送codice_1訊息會將計數加1，而傳送codice_2訊息則會將計數減1。若物件的引用計數減少到了0，則它會被銷燬。codice_9訊息類似於C++中的解構函式，在物件被銷燬之前可能會被呼叫，但系統不保證會發送該訊息。這種引用計數的模型與微軟的COM中的IUnknown介面特性十分相似，它提供了codice_10和codice_11介面，與codice_1和codice_2對應。從Objective-C 2.0開始，Objective-C執行時實現了可選的垃圾收集器。若垃圾收集的特性被啟用，則執行時會將引用計數相關的操作，例如“retain”和“release”，變為無操作。iOS上的Objective-C 2.0實現中不包含垃圾收集器。垃圾收集器執行在一個低優先順序的後臺執行緒中，並可以在使用者動作時暫停，從而保持良好的使用者體驗。主要框架.Cocoa包含三個主要的Objective-C物件庫，稱為“框架”。框架的功能類似於動態庫，即可以在執行時動態的載入應用程式的地址空間，但框架作為一個捆綁而非獨立檔案，其中除了可執行程式碼外，也包含了資源，標頭檔案和文件。Cocoa構架的一個關鍵部分是其多樣的檢視模型。總體而言，它是基於由Quartz提供的PDF繪製模型的，該特性允許使用PostScript繪製自定義圖形內容，同時也自動的支援了印表機以及類似裝置。由於Cocoa框架管理了全部的繪圖操作，例如裁剪，滾動，縮放等，程式設計師可以不再重複實現基礎的功能，而可以集中於提供程式的關鍵功能上。模型-檢視-控制器.施樂帕羅奧多研究中心的Smalltalk開發小組最終發明了一種可以簡化開發過程，提高程式碼重用率的設計哲學，即“模型-檢視-控制器”模式。這種模式將應用程式分為三個可以互動的物件集，即模型，檢視和控制器。其中，模型類代表原始資料，例如文件、設定、檔案、記憶體中的物件等，檢視是模型中資料的視覺化表現，而控制器類則包含了將模型和其對應檢視連線起來的邏輯，並保持前二者的狀態同步。Cocoa的設計遵循了嚴格的MVC原則。在OpenStep下，絕大多數的類要麼是高層的檢視類。與類似的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，無需知道物件的型別即可訪問其屬性或資料。另外，利用鍵-值-觀測器技術和NSUndoManager類，可以提供自動的撤銷/重做支援。Rich objects.Cocoa中最有用的特性是系統提供的強大的“基礎物件”，例如Foundation中的codice_14和codice_15類，提供了Unicode字串的支援；而AppKit中的codice_16系統則允許程式設計師在GUI中放置字串物件。codice_16及其相關類是用於顯示和編輯字串的。這些物件允許程式實現簡單的單行文字框，也可以實現完整的多頁，多欄文字顯示方案，方案同時可以提供支援完整的專業排版特性，例如，合字，環繞形狀的文字，旋轉，完整的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。Nu語言直接使用Objective-C的物件模型，所以無須繫結就可以呼叫Cocoa API。也有開源專案把Cocoa的大部分在其它作業系統上實現，從而使開發跨平臺的Cocoa應用成為可能。比如GNUstep和Cocotron。