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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容

  • 1、Cocoa来源 早些年,苹果公司启动Copland计划,致力于开发出自己的操作系统,可惜后来Copland计划...
    须佐能乎阅读 2,753评论 0 0
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,973评论 4 60
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,234评论 7 249
  • 将表单的项做成组件,用v-for遍历渲染数据。 在此要注意的是,v-for等指令不能直接使用在组件根元素上,即不能...
    林小刀2_0阅读 1,859评论 0 0
  • 連續多日的夜晚拉鋸,三四點入睡,三四點起床變得越來越平常。我好像掉進了一個自己給自己挖的陷阱里,一種惡性循環把我牢...
    流屿离岛阅读 347评论 0 1