一、什么是Cocoa
①Cocoa的来源
早些年,苹果公司启动了Copland计划,致力于开发出自己的操作系统,可惜后来Copland计划逐渐的失控了,苹果公司最终决定放弃开发,转向从别的公司购买下 一个版本的Mac OS。在经过调查现存的操作系统之后,苹果公司选择了NextSTEP,因为NeXTSTEP很小,苹果1996年收购了Next整个公司。关于Next公司以及这段历史,对乔帮主感兴趣的同学可以google一下。
NeXTSTEP内置许多库和工具,能让程序员以一种优雅的方式与窗口管理器进行交互,这些库叫做Framework,在1993年这些frameworks和工具被重新修改并重命名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)还有很多其他的框架,苹果和第三方厂商也随时会发布更多的框架,比如Cocoa Touch的Address Book UI框架(AddressBookUI.framework)、Game Kit框架(GameKit.framework)等等,我们在开发Cocoa程序的时候可以按照自己的实际需求添加这些框架。
二、Cocoa在Mac OS X中的位置
①Cocoa在整个Mac OS X架构中的位置
从这幅图中可以看出:
(1)还有两个和Cocoa级别相同的开发框架:Carbon,JDK。
(2)Cocoa位于整个架构的顶端,其下还依赖很多别的框架。
虽然 Cocoa 依赖于特定的框架,但它并不是仅仅“坐”在这些框架的上面。在某些情况下,Cocoa 和其它框架(比如 Carbon)是对等的,甚至可以实现一些其它对等框架不能实现的任务。Cocoa 不仅仅是基础技术上面的一个面向对象的封装层。
②另一种层级划分方式
上面这个图把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和其它架构的依赖关系
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。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程序
不知道同学们有没有想过这个问题。我们工作时只知道打开Xcode,新建工程,敲代码,编译运行,然后就告诉别人我刚刚写的这个就是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的各种优点,官方并不推荐使用它们来进行开发工作,Carbon模版在iOS SDK 3.1之后的Xcode都不再提供了,JDK的API也不再更新。
参考文档:
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html#//apple_ref/doc/uid/TP40002974-CH1-SW1