Cocoa 是什么

一、什么是Cocoa

1. 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 的前缀


2. 何为 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 中的位置

1. Cocoa 在整个 Mac OS X 架构中的位置

OS X
上图可以看出:

(1)还有两个和 Cocoa 级别相同的开发框架:Carbon), Java
(2)Cocoa 位于整个架构的顶端, 其下还依赖很多别的框架

虽然 Cocoa 依赖于特定的框架, 但它并不是仅仅“坐”在这些框架的上面. 在某些情况下, Cocoa 和其它框架(比如 Carbon)是对等的, 甚至可以实现一些其它对等框架不能实现的任务. Cocoa 不仅仅是基础技术上面的一个面向对象的封装层

2. 另一种层级划分方式

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

3. Cocoa 和其它架构的依赖关系

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 语言编写

在开发 Cocoa 软件的时候, 可以使用多种编程语言. 基本, 也是官方推荐的语言是 Objective-C. OC 拥有自己 的 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 程序

是什么因素使一个程序成为 Cocoa 程序? 肯定不是编程语言, 因为在 Cocoa 开发中可以使用各种语言; 也不是开发工具, 因为在命令行上就可以创建 Cocoa 程序(虽然那会使开发过程变得复杂, 且需要消耗大量时间). 那么, 所有 Cocoa 程序的共同点是什么? 是什么使它们变得与众不同?

因为这些程序都是由一些对象组成, 而这些对象最终都是从 NSObject 这个根类继承下来的; 还有, 这些程序都是基于 Objective-C 运行时(runtime system)环境的

上面的说法还需要做一点限制:

首先, Cocoa 还有另一个根类, 即 NSProxy. 只是 NSProxy 很少用于 Cocoa 编程. 其次, 开发者可以创建自己的根类, 需要很多时间(包括编写与 Objective-C 运行时环境进行交互的代码), 但这是可以的做到的

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

可以. 跟Cocoa处于同一级别的还有另外两个开发框架: Carbon 和 Java. 可以使用 Xcode 利用 Carbon 模版和 JDK 来进行程序开发. 只不过由于 Cocoa 的各种优点, Apple 并不推荐使用它们来进行开发工作, Carbon 模版在iOS SDK 3.1之后的 Xcode 都不再提供了, JDK的API也不再更新

参考:
Cocoa Fundamentals Guide

0%