在Mac OS X操作系统上,Cocoa和Carbon及Java一样,是一种应用程序环境。它由一组面向对象的软件库和一个运行环境组成,它的集成开发环境和其它应用程序环境相同。
本文将在这个定义的基础上进行扩展,描述Cocoa的目标、能力、和物理形式。作为一个开发者,阅读这个功能描述是理解Cocoa的第一步。
Cocoa的环境
Cocoa应用程序正逐渐成为Mac OS X的应用程序标准。iPhoto、Safari、和Mail都是Cocoa应用程序。这些应用程序由于聪明的设计、丰富的功能、和激动人心的用户界面而受到了相当程度的好评。但是,对于一般用户来说并不明显(和典型的开发周期相比)的是:这些程序从设计阶段到最终部署的过程是多么的快速。作为应用程序开发环境,是什么使Cocoa成为比Carbon切实可行、甚至是强制性的替代呢?
介绍Cocoa
和所有的应用程序环境一样,Cocoa包括两个方面:即运行环境方面和开发方面。在运行环境方面,Cocoa应用程序呈现Aqua用户界面,且和操作系统的其它可视部分紧密集成,这些部分包括Finder、Dock、和基于所有环境的其它应用程序。Cocoa无缝地成为了用户体验的一部分,在运行环境方面表现优秀。
但是,程序员更感兴趣的是开发方面。Cocoa是一个面向对象的软件组件—类—的集成套件,它使开发者可以快速创建强壮和全功能的Mac OS X应用程序。这些类是可复用和可支配的软件积木,开发者可以直接使用,或者根据具体需求对其进行扩展。从用户界面对象到Bonjour网络,几乎每个想象得到的开发需求都存在对应的Cocoa类;对于没有预想到的需求,您可以轻松地从现有类派生出子类来实现。
在各种面向对象的开发环境中,Cocoa有着最为著名的血统。从1989年作为NeXTSTEP推出到现在,人们一直对它进行精化和测试(参见"一点历史"部分)。它优雅而强大的设计完美地适合所有类型的快速软件开发:不仅适合开发应用程序,也适合开发命令行工具、插件、和不同类型的程序包。Cocoa为您的应用程序“免费”提供很多行为和外观,使您可以将更多的时间用于有特色的功能上(有关Cocoa提供的功能的详细信息,请参见"Cocoa应用程序的特性"部分)。
在开发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对象混合在一起使用(在某些限制下)。
重要信息:Cocoa-Java是熟悉Java语言的开发者的学习环境,我们并不推荐将它用于产品开发。Objective-C API会不断进化,而Cocoa-Java API并不并行维护。 |
您甚至可以用PyObjC,即Python/Objective-C桥来进行Cocoa编程。基于PyObjC,您可以用Python来书写Cocoa程序。Python是一种解释性的、注重交互的、及面向对象的编程语言。PyObjC使Python对象可以向Objective-C对象传递消息,就象传递给Python对象一样;同时还使Objective-C对象可以向Python对象传递消息。更多信息请参见"用Python开发基于PyObjC的Cocoa应用程序"文档,它位于苹果开发者联盟(Apple Developer Connection)网站上。
核心的Cocoa类库封装在两个框架中,即Foundation和Application Kit框架。和所有框架一样,这两个框架不仅包含动态共享库(有时是几个兼容版本的库),还包含头文件、API文档、和相关的资源。Application Kit和Foundation框架的分割反映了Cocoa编程接口分为图形用户界面部分和非图形接口。这两个框架对于最终产品为应用程序的Cocoa工程来说都是必要的。还有几个较小的、使用Cocoa编程接口的框架和Mac OS X一起发行,比如Screen Saver(屏幕保护)和Address Book(地址簿)框架。随着时间的推移,还会有更多框架加入到操作系统中。更多信息请参见"Cocoa框架"部分。
Cocoa在Mac OS X中的位置
下图显示了一个简化了的Mac OS X系统架构框图:
这个框图只是为了一个简单的目的:为那些不熟悉苹果平台的开发者明确指出Mac OS X的主要组件及其依赖性。为了简洁,图中省略了一些重要细节,并使其它部分变得模糊。这些细节构成了框图的重要部分,显示Cocoa和Mac OS X其它部分的关系。
下图在架构级别上更为精确地反映了Cocoa的位置。这个框图将Mac OS X显示为一系列的软件层,从系统的基础Darwin到各种应用程序环境。位于中间的层代表包含在Core Services(核心服务)和Application Services(应用程序服务)这两个主要的雨伞框架下的系统软件。在这个框图中,一个层通常依赖于其下面的其它层。
在某些方面,这个框图类似于先前的框图。举例来说,主要负责Aqua用户界面渲染的系统组件Quartz(在Core Graphics框架中实现)是Application Services层的一部分。架构栈的基础部分是Darwin,包括Cocoa在内的Mac OS X各个部分最终都依赖于Darwin。
但是,如果您进一步查看雨伞框架中的一个(或一组)Cocoa子类或特定的子框架,就会发现Cocoa或者对Mac OS X其它部分有特定的依赖性,或者通过自身的接口向外部提供基础的技术。下图部分显示了上述的依赖性和外部接口。
请注意:虽然Cocoa依赖于特定的框架,但它并不是仅仅“坐”在这些框架的上面。在某些情况下,Cocoa和其它框架(比如Carbon)是对等的,甚至可以实现一些其它对等框架不能实现的任务。Cocoa不仅仅是基础技术上面的一个面向对象的封装层。 |
苹果公司对Cocoa进行了认真的设计,使Cocoa编程接口成为应用程序通常需要的基础技术访问通道。但是如果您需要的某些能力不能在Cocoa的接口中找到,或者需要对应用程序进行更为精细的控制,那么也可以直接使用底层的框架(Core Graphics就是一个重要的例子,通过调用该框架或OpenGL的函数,您的代码可以画出比Cocoa描画方法能做到的、更加复杂而具有细微差别的图像)。幸运的是,使用这些低级别的框架并不是问题,因为绝大多数依赖框架的编程接口是用ANSI C写的,Objective-C是其超集。
请注意:架构概述部分的目的并不是列举出Cocoa有哪些接口或者它对Mac OS X其它部分有哪些依赖性。相反,概述部分只是考虑最有趣的部分,目的是给您一个有关框架架构的基本思想。 |
Cocoa依赖的、或者通过类和方法为之提供访问通道的主要基础框架有Core Foundation,Carbon,Core Graphics (Quartz),Launch Services,和Print Core (打印子系统)。详细信息如下:
Core Foundation。Foundation框架的很多类都基于Core Foundation中对应的封装类型。它们之间的这种紧密关系使“免费桥接”技术—即在兼容的Core Foundation和Foundation类型之间实现类型转换—成为可能。某些Core Foundation的实现又基于Darwin 层的BSD部分。
Carbon。Cocoa使用了Carbon提供的某些服务,因为有些Carbon框架在Core Services和Application Services层中定位为系统级别的服务。作为例子,Carbon Core就是这些框架中特别重要的一个,Cocoa使用了它提供的File Manager(文件管理器)组件来进行不同文件系统表示之间的转换。
Core Graphics。Cocoa描画和图像处理类(相当自然且紧密地)基于Core Graphics框架,它实现了Quartz和窗口服务器组件。
Launch Services。NSWorkspace类负责向外提供Launch Services的潜在能力。Cocoa还使用Launch Services提供的应用程序注册功能来获取与应用程序及文档相关联的图标。
Print Core。Cocoa的打印类是打印子系统的一个面向对象的接口。
此外,Cocoa还使用Carbon环境的Text Encoding Converter(文本编码转换器)服务来处理一些字符串编码转换。还有一些Cocoa方法向外提供I/O Kit框架、QuickDraw (QD)框架、 Apple Event (AE)框架、和ATS框架的部分功能,分别用于进行电源管理、QuickDraw描画、 Apple Event处理、以及提供字体支持。