Cocoa是什么

一、什么是Cocoa

<br />

①Cocoa來源

1996年,Gil Amelio掌權的Apple正在開發Copland操作系統,這是Apple歷史上最爛的產品之一。被Gil Amelio雇進來的女英雄Ellen Handcock在同年8月果斷放棄了Copland,轉向從別的公司購買下 一個版本的Mac OS。在經過調查現存的操作系統之后,Apple公司選擇了NeXTSTEP,因為NeXTSTEP很小,Apple在1996年整個收購了NeXT。

NeXTSTEP內置許多庫和工具,能讓程序員以一種優雅的方式與窗口管理器進行交互,這些庫叫Framework,在1993年,NeXT公司和Sun公司合作把這些Frameworks和工具重新修改并重命名為OpenStep,后來NeXT被Apple收購以后,OpenStep被重命名為Cocoa,這也是為什么Cocoa的類都有著NS的前綴。

②何為Cocoa

Cocoa(iOS上叫Cocoa Touch)是一個面向對象的軟件組件-----類的集成套件,它使開發者可以快速創建強壯和全功能的 Mac OS X (iOS)應用程序。

Cocoa包含了很多框架,其中最最核心的有兩個:
(1)Foundation框架

Foundation框架包含所有和界面顯示無關的類。

(2)Application Kit(AppKit)框架(Cocoa Touch中叫UIKit框架)

Application Kit 框架包含實現圖形的、事件驅動的用戶界面需要的所有對象:窗口、對話框、按鍵、菜單、 滾動條、文本輸入框----這個列表還在不斷增加。

Foundation 和 Application Kit (UIKit)框架在 Cocoa 開發中是必要的框架,其它框架則是輔助和可選(當然也可以只用 Foundation 框架創建一個 Cocoa 程序,而不涉及其它框架,比如令行工具和 Internet 服務器)。和所有框架一樣,這兩個框架不僅包含動態共享庫(有時是幾個兼容版本的庫),還包含頭文件、API文檔、和相關的資源。

除了這兩個最核心的,Cocoa(Cocoa Touch)還有很多其他的框架,Apple和第三方廠商也隨時會發布更多的框架,比如Cocoa Touch的Address Book UI框架(AddressBookUI.framework)、Game Kit框架(GameKit.framework)等等,在開發Cocoa程序的時候可以按照自己的實際需求添加這些框架。

二、Cocoa在Mac OS X中的位置

①Cocoa在整個Mac OS X架構中的位置

<br />


OS X

上圖可以看出:

(1)還有兩個和Cocoa級別相同的開發框架:CarbonJDK
(2)Cocoa位于整個架構的頂端,其下還依賴很多別的框架。

雖然 Cocoa 依賴于特定的框架,但它并不是僅僅“坐”在這些框架的上面。在某些情況下,Cocoa 和其它框架(比如 Carbon)是對等的,甚至可以實現一些其它對等框架不能實現的任務。Cocoa 不僅僅是基礎技術上面的一個面向對象的封裝層。

②另一種層級劃分方式

<br />

OS X

上圖把Mac OS X的架構分了四個部分:

(1)User Experience,這個一般可以理解為Application.
(2)Application Frameworks,這個理解為主要包括像Cocoa這樣的組件。
(3)Graphics and Media,這個理解為Application Service和Core Service。
(4)Darwin,這個就是Mac OS X的kernel。

③Cocoa和其它架構的依賴關系

<br />

依賴關系

Cocoa 依賴的、或者通過類和方法為之提供訪問通道的主要基礎框架有 Core Foundation,Carbon,Core Graphics (Quartz),Launch Services,和 Print Core (打印子系統)。詳細信息如下:

(1)Core Foundation

Foundation 框架的很多類都基于 Core Foundation 中對應的封裝類型。它們之間的這種緊密關系使“免費橋接”技術----即在兼容的Core Foundation和Foundation類型之間實現類型轉換----成為可能。某些 Core Foundation 的實現又基于 Darwin 層的 BSD 部分。

(2)Carbon

Cocoa 使用了 Carbon 提供的某些服務,因為有些 Carbon 框架在 Core Services 和 Application Services 層中定位為系統級別的服務。作為例子,Carbon Core 就是這些框架中特別重要的一個,Cocoa 使用了它提供的 File Manager(文件管理器)組件來進行不同文件系統表示之間的轉換。

(3)Core Graphics

Cocoa 繪制和圖像處理類(相當自然且緊密地)基于 Core Graphics 框架,它實現了 Quartz 和窗口服務器組件。
Launch Services。NSWorkspace 類負責向外提供 Launch Services 的潛在能力。Cocoa 還使用 Launch Services 提供的應用程序注冊功能來獲取與應用程序及文檔相關聯的圖標。

(4)Print Core

Cocoa 的打印類是打印子系統的一個面向對象的接口。

此外,Cocoa 還使用 Carbon 環境的 Text Encoding Converter(文本編碼轉換器)服務來處理一些字符串編碼轉換。還有一些 Cocoa 方法向外提供 I/O Kit 框架、QuickDraw (QD)框架、 Apple Event (AE)框架、 和 ATS 框架的部分功能,分別用于進行電源管理、QuickDraw 描畫、 Apple Event 處理、以及提供字體 支持。

三、Cocoa程序不只能通過Objective-C語言編寫

<br />

在開發 Cocoa 軟件的時候,可以使用多種編程語言。基本的,也是官方推薦的語言是 Objective-C。Objective-C 擁有自己 的 Cocoa 運行環境,又是 ANSI C 的超集,它在 ANSI C 的語法和語義特性上(從 Smalltalk 派生而來)進行擴展,使之支持面向對象的編程,新增的規則簡單而又易于學習和使用。由于 Objective-C 是基于 ANSI C 的,可以自由地將 C 代碼直接和 Objective-C 代碼混合在一起。而且代碼可以調用非 Cocoa 的編程接口中定義的所有函數,比如 Carbon 和 BSD。甚至可以將 C++代碼混合到 Cocoa 代碼中,并將它們連接在同一個執行文件中。

同時Cocoa 還支持 Java,Cocoa 為此定義了一個平行的 Java 類庫,并且實現 了一個將 Java 接口映射到 Objective-C 實現的橋機制。Cocoa 的 Java 支持使開發者可以將本地的 Java 對象 和 Cocoa 對象混合在一起使用(在某些限制下)。甚至可以用PyObjC,即Python/Objective-C橋來進行Cocoa編程。Python是一種解釋性的、注重交互的、及面向對象的編程語言。PyObjC使Python對象可以向 Objective-C對象傳遞消息,就象傳遞給Python對象一樣;同時還使Objective-C對象可以向Python對象傳遞消息。

四、如何判斷一個程序是不是Cocoa程序

<br />

是什么因素使一個程序成為 Cocoa 程序?肯定不是編程語言,因為在 Cocoa 開發中可以使用各種語言;也不是開發工具,因為在命令行上就可以創建 Cocoa 程序(雖然那會使開發過程變得復雜,且需要消耗大量時間)。那么,所有 Cocoa 程序的共同點是什么?是什么使它們變得與眾不同?

因為這些程序都是由一些對象組成,而這些對象最終都是從 NSObject 這個根類繼承下來的;還有,這些程序都是基于 Objective-C 運行時(runtime system)環境的。

上面的說法還需要做一點限制:

首先,Cocoa 還有另一個根類,即 NSProxy。只是 NSProxy 很少用于 Cocoa 編程。其次,開發者可以創建自己的根類,需要很多時間(包括編寫與 Objective-C 運行時環境進行交互的代碼),但是這是可以的做到的。

五、除了Cocoa外是否還可以使用其它框架開發Mac OS X (iOS)程序

<br />
可以。跟Cocoa處于同一級別的還有另外兩個開發框架:Carbon和Java。可以使用Xcode利用Carbon模版和JDK來進行程序開發。只不過由于Cocoa的各種優點,Apple并不推薦使用它們來進行開發工作,Carbon模版在iOS SDK 3.1之后的Xcode都不再提供了,JDK的API也不再更新。

參考:
Cocoa Fundamentals Guide

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、Cocoa來源 早些年,蘋果公司啟動Copland計劃,致力于開發出自己的操作系統,可惜后來Copland計劃...
    須佐能乎閱讀 2,814評論 0 0
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,229評論 4 61
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,546評論 7 249
  • 將表單的項做成組件,用v-for遍歷渲染數據。 在此要注意的是,v-for等指令不能直接使用在組件根元素上,即不能...
    林小刀2_0閱讀 1,888評論 0 0
  • 連續多日的夜晚拉鋸,三四點入睡,三四點起床變得越來越平常。我好像掉進了一個自己給自己挖的陷阱里,一種惡性循環把我牢...
    流嶼離島閱讀 357評論 0 1