什么是Cocoa?

在Mac OS X操作系统上,Cocoa和Carbon及Java一样,是一种应用程序环境。它由一组面向对象的软件库和一个运行环境组成,它的集成开发环境和其它应用程序环境相同。

本章将在这个定义的基础上进行扩展,描述Cocoa的目标、能力、和物理形式。作为一个开发者,阅读这个功能描述是理解Cocoa的第一步。

本部分包含如下内容:

Cocoa的环境
Cocoa应用程序的特性
开发环境
Cocoa框架
一点历史

 

Cocoa的环境

Cocoa应用程序正逐渐成为Mac OS X的应用程序标准。iPhoto、Safari、和Mail都是Cocoa应用程序。这些应用程序由于聪明的设计、丰富的功能、和激动人心的用户界面而受到了相当程度的好评。但是,对于一般用户来说并不明显(和典型的开发周期相比)的是:这些程序从设计阶段到最终部署的过程是多么的快速。作为应用程序开发环境,是什么使Cocoa成为比Carbon切实可行、甚至是强制性的替代呢?

本部分包含如下内容:

介绍Cocoa
Cocoa在Mac OS X中的位置


介绍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中的位置

图1-1显示了一个简化了的Mac OS X系统架构框图:

 

图1-1  Mac OS X架构—简化视图

Mac OS X architecture?simplified perspective

 

这个框图只是为了一个简单的目的:为那些不熟悉苹果平台的开发者明确指出Mac OS X的主要组件及其依赖性。为了简洁,图中省略了一些重要细节,并使其它部分变得模糊。这些细节构成了框图的重要部分,显示Cocoa和Mac OS X其它部分的关系。

图1-2在架构级别上更为精确地反映了Cocoa的位置。这个框图将Mac OS X显示为一系列的软件层,从系统的基础Darwin到各种应用程序环境。位于中间的层代表包含在Core Services(核心服务)和Application Services(应用程序服务)这两个主要的雨伞框架下的系统软件。在这个框图中,一个层通常依赖于其下面的其它层。

 

图1-2  Cocoa在Mac OS X架构中的位置

Cocoa in the architecture of Mac OS X

 

在某些方面,这个框图类似于先前的框图。举例来说,主要负责Aqua用户界面渲染的系统组件Quartz(在Core Graphics框架中实现)是Application Services层的一部分。架构栈的基础部分是Darwin,包括Cocoa在内的Mac OS X各个部分最终都依赖于Darwin。

但是,如果您进一步查看雨伞框架中的一个(或一组)Cocoa子类或特定的子框架,就会发现Cocoa或者对Mac OS X其它部分有特定的依赖性,或者通过自身的接口向外部提供基础的技术。图1-3部分显示了上述的依赖性和外部接口。

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

 

 

图1-3  进一步考察Cocoa架构—一些主要的依赖关系

Zooming in on the Cocoa architecture

 

苹果公司对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处理、以及提供字体支持。

进一步阅读: Mac OS X技术概浏览一书给出有关框架、服务、技术、和Mac OS X其它组件的概览。苹果人机界面指南一书则专注于说明Aqua人机界面的外观和行为。

 

 

Cocoa应用程序的特性

创建一个Cocoa应用程序,而又不必编写哪怕一行代码的情况是可能的。在Xcode中建立一个新的Cocoa工程,然后进行连编就可以了。当然,这个应用程序不做很多工作,至少不做很多有趣的工作。但是,这个极度简单的应用程序在鼠标双击时仍然可以启动,可以在Dock上显示图标,可以显示其主菜单和窗口(标题为“Window”),可以根据命令将自身隐藏,可以和其它运行着的应用程序互动,还可以处理退出命令。您可以对这个窗口进行移动、调整尺寸、最小化、和关闭,甚至可以打印包含在窗口中的空白部分。

想像一下如果加入一点代码,您可以做些什么。

在编程方面,Cocoa为开发者提供很多免费或代价很低的支持。当然,要成为一个高效率的Cocoa开发者意味着要熟悉新的概念、设计模式、编程接口、和开发工具,而这方面的努力并不是无足轻重的。但是熟能生巧,编程在很大程度上变成一种将Cocoa提供的编程组件和负责定义特殊逻辑的定制对象及代码装配在一起、再将这些装配物组合在一起的练习。

接下来的部分是一个简短的列表,说明Cocoa如何为您的应用程序增加价值,而只需要您加入少量的工作(有时候甚至不需要):

  • 基本应用程序框架—Cocoa为事件驱动的行为和应用程序、窗口、工作空间(workspace)的管理提供了基础设施。在大多数情况下,您不必直接处理事件或发送任何描画命令给渲染库。

  • 用户界面对象—Cocoa为应用程序的用户界面提供了丰富而又现成的对象。这些对象的大部分都在Interface Builder(创建用户界面的开发工具)的选盘上,您只要简单地将对象从选盘拖拽到界面上,配置好属性,并将它连接到其它对象上就可以了(当然,您也可以通过编程的方式对其进行实例化、配置、以及建立对象之间的连接)。下面是一些Cocoa用户界面对象的实例:

    windows

    text fields

    radio buttons

    drawers

    sheets

    tab views

    table views

    browsers

    pop-up lists

    sliders

    image views

    color wells

    combo boxes

    scroll views

    text views

    steppers

    此外,Cocoa还有一些支持用户界面的技术,包括提高可访问性、执行正当性检查、以及连接用户界面对象和定制对象需要的技术。

  • 描画和图像处理—Cocoa带有一个可以锁定图形焦点并将视图(或视图的一部分)标识为“变脏” 的框架,从而支持高效的定制视图描画。Cocoa中还有一些描画贝齐尔(Bezier)路径、执行远交变换、合成图像、以及创建不同图像表示的编程工具类。

  • 系统交互—Cocoa使您的应用程序可以和文件系统、工作空间、以及其它应用程序进行交互(或使用它们提供的服务)。

  • 数据交换—Cocoa通过拷贝-粘贴、拖拽模型、以及Services菜单简化了应用程序内部和应用程序之间的数据交换。

  • 性能—为了增强应用程序的性能,Cocoa提供了多线程、空闲时间处理、资源的迟缓加载、内存管理、和运行环操作方面的编程支持。

  • 基于文档的应用程序—Cocoa为应用程序提供一种可以包含无限数量的文档架构。每个文档都包含在它自己的窗口中(比如一个字处理程序)。事实上,如果您选择“Document-based application(基于文档的应用程序)”工程类型,那么这类应用程序需要的很多组件就自动被创建了。

  • 脚本处理—通过应用程序脚本能力信息和一组支持脚本的Cocoa类,您就可以使自己的应用程序具有脚本能力。也就是说,您的应用程序可以响应由AppleScript脚本发出的命令。应用程序也可以通过执行脚本或使用单独的Apple Event来向其它应用程序发送命令,或者接受其它应用程序的命令。结果是每个具有脚本能力的应用程序都可以为用户或其它应用程序提供服务。

  • 国际化—Cocoa使用一种已经精化多年的方法来支持国际化和本地化。这种方法基于偏好语言的用户列表,将本地化的资源放到应用程序的程序包(bundle)中。Cocoa还提供产生和访问本地化字符串的工具和编程接口。而且,Cocoa中的文本操作缺省情况下是基于Unicode的,因此有利于程序的国际化。

  • Undo管理—您可以注册一个用户动作来和undo管理器协同工作,当用户选择合适的菜单项时,它们会处理undo(或redo)动作。Undo管理器通过独立的栈来维护undo和redo操作。

  • 文本—Cocoa提供了一个复杂的文本系统,使您可以进行从简单到较为复杂的文本处理,简单文本处理的一个例子是在文本视图上显示可编辑的文本,复杂的处理则比如字距和连字的控制、拼写检查、和嵌入图像。

  • 打印—和文本系统相类似,打印架构使您可以打印文档和其它应用程序内容,并进行各种控制调整。在最简单的级别上,您缺省可以打印各种视图的内容;在较为复杂的级别上,您可以定义打印的内容和格式,控制一个打印作业如何进行,以及在打印面板上添加必要的视图。

  • 偏好设置用户缺省设置系统基于一个系统范围内的数据库,您可以将全局或应用程序特有的偏好设置存储在这个数据库中。

  • 连网—Cocoa包含一个分布式对象(Distributed Objects)架构,它使一个Cocoa进程可以和相同或不同的计算机上的其它进程进行通讯。这个架构还提供将Bonjour能力集成到应用程序的编程接口。

  • 多媒体—Cocoa提供了QuickTime视频和基本音频能力的支持。

 

开发环境

说Cocoa有它自己的开发环境并不十分精确。一个原因是程序员可以使用苹果主要的开发工具—Xcode和Interface Builder—来开发Mac OS X其它应用程序环境的程序,比如Carbon;其次,开发Cocoa应用程序时完全不使用Xcode和Interface Builder也是可能的,比如,您可以使用Metrowerks的CodeWarrior来管理、编译、和调试Cocoa工程;而且,如果您实在不愿意改变,也可以使用像Emacs这样的文本编辑器来编写代码,用make file和命令行进行应用程序的连编,然后在命令行上通过gdb调试器来调试程序。

但是,Xcode和Interface Builder是开发Cooca软件优先使用的工具。它们的起源正好和Cocoa是一致的,所以在工具和框架之间存在高度的兼容性。Xcode和Interface Builder一起,使设计、管理、连编、和调试Cocoa软件工程变得非常容易。还有一个叫AppleScript Studio的工具,可以扩展应用程序的能力,您可以通过这个工具来创建具有脚本能力的Cocoa程序和通过AppleScript控制其它应用程序的程序。

本部分包含如下内容:

Xcode
Interface Builder
AppleScript Studio
其它开发工具


Xcode

Xcode是苹果公司在Mac OS X下的集成开发环境(IDE)引擎。它负责处理从最开始到工程的最终部署这一过程中的大多数细节。您可以通过这个工具来完成如下工作:

  • 创建和管理工程,包括指定目标的需求、依赖性、和连编的风格。

  • 在具有语法染色、自动缩进等功能的编辑器上编写源代码。

  • 在工程的不同组件中进行漫游和检索,包括头文件和文档。

  • 连编工程

  • 在图形化的源代码级调试器上调试工程

Xcode可以连编由C、C++、Objective-C、Objective-C++、和Java编写的源代码组成的工程,可以生成Mac OS X支持的所有类型的执行代码,包括命令行工具、框架、插件、内核扩展、程序包、和应用程序。Xcode允许您对连编和调试工具、可执行文件的打包方式(包括信息属性列表和本地化程序包)、连编过程(包括拷贝文件、脚本文件处理、和其它连编阶段)、以及用户界面(包括分立和多视图的代码编辑器)进行几乎无限的定制;还支持几个源代码管理系统(其中有CVS和Perforce),使您可以将文件追加到代码库、提交修改、获取更新版本、以及进行版本的比较。

图1-4显示一个Xcode工程的实例。

 

图1-4  Xcode中的TextEdit实例

The TextEdit example project in Xcode

 

Xcode特别适合用于Cocoa开发。在创建工程时,Xcode可以通过对应于Cocoa工程类型的工程模板,为您建立一个初始的开发环境。Cocoa工程类型有:应用程序(Objective-C或Java)、基于文档的应用程序(Objective-C或Java)、工具、程序包、和框架。Xcode使用GNU C编译器(gcc)来编译Cocoa软件,使用GNU源代码级调试器(gdb)来调试软件。在Cocoa开发中使用gccgdb从它还是NeXTSTEP(参见"一点历史"部分)的时代就开始了。对Cocoa二进制代码的编译和调试经过多年的精化、扩展、和调优。

Xcode也有一个类浏览的功能,可以查看所有导入的Cocoa框架类和您自己的定制类,还有它们的继承关系;从类浏览器中,您可以请求查看任何类的文档。Xcode还包含一些设计工具,其中有一个工具可以用于设计Core Data程序中使用的数据实体的属性和关系。

Xcode和另外一个主要的开发工具Interface Builder良好地集成在一起。在Interface Builder中,您可以定义一个类(包括超类,插座变量,和动作),并为工程中的每个类生成源代码文件的框架。在Xcode中,您可以为定制类添加插座变量和动作,然后让Interface Builder将这些实体导入到nib文件中。

请注意:简单地说,插座变量(outlet)是一个对象和另一个对象的归档连接(表示为对象中的一个实例变量);动作则是当按键或滑块这类对象被操作时,在被称为目标(target)的对象(通常是一个定制对象)中被调用的方法。Interface Builder也会把目标对象和其它对象(称为控件)之间的连接进行归档。

 

进一步阅读:Xcode快速指南可以使您概览Xcode,并为您提供其它开发工具文档的连接。

 

Interface Builder

Cocoa工程的第二个主要开发工具是Interface Builder。顾名思义,Interface Builder是用于创建用户界面的图形工具。Interface Builder在Cocoa还是NeXTSTEP的时候就已经存在了,而且从那时侯起,它就作为同类软件中的佼佼者而获得广泛的认可。很自然,它和Cocoa的结合是很紧密的。而且您也可以用它来为Carbon应用程序创建用户界面。

Interface Builder以三个主要的设计元素为中心:

  • Nib文件nib文件实际上是以档案的形式对用户界面中出现的对象进行文件包装(一个封装的目录)。这种档案本质上是一种对象图,包含每个对象的信息,包括对象的尺寸及在其屏幕(如果是个窗口)或窗口内的位置信息。Cocoa应用程序中的Nib文件还包含定制类的代理引用和对象间连接信息,包括使用Cocoa绑定技术建立起来的连接。当您在Interface Builder中创建并保存一个用户界面时,重建该界面需要的所有信息都会被存在nib文件中。nib文件还可以包含界面中使用的图像和声音文件。

    Interface Builder将nib文件存储在Cocoa工程中的一个本地化目录下。在连编工程时,nib文件就会被拷贝到新建的程序包中对应的本地化目录下(nib文件因此可以提供一种很好的用户界面本地化方法)。 Cocoa应用程序缺省(也就是说Xcode会自动创建)有一个主nib文件,在运行时自动被装载和显示。主nib文件包含应用程序的主菜单,并可能有一个或多个窗口。您的应用程序可以根据需要装载辅助的nib文件,比如文档或预置窗口所在的文件。

    Interface Builder将nib文件的内容表示在nib文件窗口中。您也可以在nib文件窗口中定义定制类及考察对象之间的连接。

  • 选盘。 Interface Builder的选盘(Palette)窗口中包含多个面板,或者称为“选盘”,每个选盘中包含一个彼此有关系的用户界面对象的集合。将对象从选盘拖拽到恰当的位置上就可以创建用户界面了,这里的位置可以是屏幕、窗口、各种视图、或者主菜单(选盘对象自身不一定是可见的,但是必须以某种形式影响用户界面)。当您将一个对象从选盘上拖出时,Interface Builder会实例化一个该对象的缺省实例。这个实例是一个真正的Cocoa对象,而不是运行时需要创建的实例的代理对象。如果您愿意的话,可以将您自己的定制对象放在选盘上。

  • 查看器。 Interface Builder为用户界面上的对象提供一个查看器(称为Info窗口)。Info窗口由一系列可选择的面板组成,用于设置对象的初始属性和尺寸(虽然尺寸和很多属性也可以直接进行操作)。其中的两个面板用于建立对象之间的连接,一个基于插座变量和动作,另一个基于绑定技术。还有一个面板用于将定制类代替Application Kit框架中的超类。其它面板较为特殊,专用于建立用户界面对象和帮助标签及AppleScript事件处理器之间的关联。

图1-5显示了一个在Interface Builder中打开的nib文件,以及支持窗口。

 

图1-5  Interface Builder中TextEdit的预置窗口

TextEdit’s Preferences window in Interface Builder

 

用Interface Builder创建用户界面的步骤比较直接:

  1. 将窗口或面板拖拽到屏幕上(面板等同于对话框或辅助窗口)。

  2. 设置窗口的初始(或固定的)位置、尺寸、和属性。

  3. 将文本框、按键、表视图控件、和弹出式列表等对象拖到窗口或之前放好的视图对象上。

  4. 为这些对象设置初始(或固定的)位置、尺寸、和属性。

  5. 为应用程序定义定制类。

    您可以直接在Interface Builder中完成这个工作,或者将事先创建好的头文件装载到Interface Builder。在进行类的定制时,可以通过Interface Builder指定插座变量和动作。

  6. 在对象之间建立绑定和连接。这有两种形式:

    • 在应用程序的视图、控制器、和模型对象之间建立绑定关系。

    • 插座变量连接到它们引用的对象,接着把动作连接到目标对象中合适的方法上。

  7. 保存和测试用户界面。 

    Interface Builder有一个功能,可以在设计的各个阶段测试界面(定制的行为除外)。

  8. 为您定义的各个定制类创建头文件和源代码文件,这些文件会出现在关联的Xcode工程上。

Interface Builder还包含一个功能:在对一个摆好位置的对象进行移动或调整其尺寸时,会通过一些短暂出现的蓝线来显示当前位置是否遵循Aqua人机界面指南,包括推荐的尺寸、对齐、与用户界面上的其它对象或窗口边界的相对位置。

进一步阅读:有关用户界面开发工具的进一步信息,请参见Interface Builder部分。此外,"Nib文件"部分给出了nib文件及其在应用程序中如何被使用的更多信息。您还可以参考"对象之间的通讯"部分,以概要了解插座变量、目标-动作机制、以及Cocoa绑定技术。

 

AppleScript Studio

多年来,Mac OS一直有一个定义良好的特性,就是用户可以通过由AppleScript语言写成的脚本控制应用程序。很多用户发现这个特性是不可或缺的,因为它可以将涉及多个应用程序的复杂操作序列串接在一起。AppleScript的能力在Mac OS X系统上更进了一步。AppleScript Studio是一种开发技术,用于创建通过AppleScript脚本控制复杂用户界面的Cocoa程序。

AppleScript Studio把来自AppleScript、Xcode、Interface Builder、和Cocoa的各种元素结合起来,提供了一个创建AppleScript解决方案的开发环境。您可以通过它来制作应用程序,完成如下任务:

  • 执行AppleScript脚本

  • 控制应用程序的界面

  • 控制具有脚本能力的应用程序或操作系统中支持脚本的部分

由于AppleScript Studio将AppleScript和Xcode、Interface Builder、和Cocoa集成在一起,脚本编程者可以利用这些组件各自的优势和能力。他们可以从Interface Builder选盘中拖出一组丰富的用户界面对象,根据个人的喜好进行定制;可以得到内置的Aqua用户界面指南的支持;还能够连编和维护带有多个目标和连编步骤的的复杂工程。

这个开发环境使我们有可能通过脚本对Script Editor程序(它是创建AppleScript脚本的传统工具)不能提供的能力进行控制,这些能力包括:

  • 创建任意大的脚本

  • 在脚本中进行检索和替代

  • 单步脚本调试,支持各种执行方式

  • 方便访问脚本中的处理函数和属性

  • 灵活的字典查看器,和应用程序的脚本用语一起使用。

进一步阅读:更多信息请参见AppleScript Studio编程指南

 

其它开发工具

虽然Xcode和Interface Builder是开发Cocoa应用程序的主要工具,但是还有许多工具可以使用。在一些应用程序开发阶段中,您可能会找到很多辅助的应用程序和命令行工具。

这个部分将回顾一些辅助性的开发工具并简短地讨论一些命令行工具,然而命令行工具的数量太多,即使对它们进行一个浓缩的总结也超出了本文的范围。您的最好选择就是访问/usr/bin/usr/sbin目录下各种工具的使用手册(man页面),只要在Terminal外壳下键入man命令,后面跟着命令名称就可以了。在/Developer/Tools目录下还有一些苹果开发的命令行工具。

性能工具

下面这些应用程序用于软件性能的测量和分析。它们位于/Developer/Applications目录下。

  • Sampler 用于分析程序运行时的行为和内存分配。顾名思义,Sampler会按一定的时间周期对程序的函数调用栈进行采样,并在采样结束时向您显示调用频率最高的函数或方法。这种信息有助于定位消耗大量CPU时间或进行内存分配的函数或方法。

  • ObjectAlloc 用于跟踪各种程序的内存分配与释放行为。这种历史数据可以显示重复的内存分配行为和总体的分配趋势。对于Objective-C代码,ObjectAlloc在记录alloc调用的同时,也记录每个copyretainreleaseautorelease调用,而且还记录在Core Foundation中与这些方法相对应的函数,以及malloc(及相关)函数进行的内存分配。

  • MallocDebug 按分配时的调用栈顺序显示程序中当前已分配的内存块。通过这个工具一下子就可以看到您的应用程序消耗多少内存、这些内存是从哪里分配的、以及哪些函数分配了大量的内存。MallocDebug还可以找出在程序中分配的、却没有被引用的内存,因此可以帮助您发现内存泄露并跟踪这些泄露的内存是在哪里分配的。

  • QuartzDebug 是一个帮助您对应用程序的显示机制进行调试的工具,对大量进行描画和图像处理的应用程序特别有用。QuartzDebug包括如下几个调试选项:

    • 自动闪烁描画模式,这种模式会在每个描画操作之后闪烁一下图形上下文。

    • 在更新屏幕区域之前先用黄色对该区域进行描画的模式。

    • 用于取得整个系统的窗口列表的静态快照,同时给出每个窗口的拥有者及该窗口消耗多少内存的选项。

  • Thread Viewer 显示一个进程中各个线程的活动。这个工具显示每个线程的活动时间线,动作在时间线上用不同的颜色表示。点击时间线可以得到与点击位置相对应的活动回溯样本。

还有一些命令行工具可以用于性能分析,比如:

  • top,对当前正在运行的进程进行采样统计并显示统计结果。

  • gprof,用于产生程序的执行轮廓

  • fs_usage,显示文件系统访问的统计信息

还有其它很多命令行工具可以用于性能分析。有关Cocoa应用程序开发可以用哪些性能分析工具以及性能分析的概念、技术、和策略的更多信息,请参见性能编程主题Performance Programming Topics)文档。

请注意:性能概述对Mac OS X的性能工具进行讨论。

 

其它工具

您还可以发现下面的工具对Cocoa应用程序开发很有用(位于/Developer/Applications目录下):

 

  • Icon Composer和Icns Browser 您可以用Icon Composer来导入各种格式的图像,创建应用程序图标和文档图标的图标文件;还可以用Icns Browser程序来创建不同尺寸、位深度、和位掩码的图标变体。

 

 

  • FileMerge 这个工具可以可视化地“diffs” 各种文本文件(比如源代码文件、头文件、和属性列表),并具有选择合并的能力。

 

 

  • Package Maker 通过Installer程序为应用程序(其它类型的软件)制作安装包。

 

 

  • Property List Editor 这是一个编辑器,用于创建和编辑XML及较老风格的属性列表。

Cocoa框架

是什么因素使一个程序成为Cocoa程序呢?肯定不是编程语言,因为在Cocoa开发中您可以使用各种语言;也不是开发工具,因为您在命令行上就可以创建Cocoa程序(虽然那会使开发过程变得复杂,且需要消耗大量时间)。那么,所有Cocoa程序的共同点是什么?是什么使它们变得与众不同?答案是这些程序都是由一些对象组成,而这些对象最终都是从NSObject这个根类继承下来的;还有,这些程序都是基于Objective-C运行环境的。这个说法对于所有的Cocoa框架来说也是正确的。

请注意:上面的说法还需要做一点限制。首先,Cocoa还有另一个根类,即NSProxy。只是NSProxy很少用于Cocoa编程。其次,您可以创建您自己的根类,只是这需要很多工作(包括编写与Objective-C运行环境进行交互的代码),而且为此花费时间可能是不值得的。

Mac OS X包含多个Cocoa框架,苹果和第三方厂商也随时会发布更多的框架。无论Cocoa框架有多么丰富,有两个框架总是与众不同:即Foundation和Application Kit框架,它们是核心的Cocoa框架。如果您没有连接并使用Application Kit框架中的类,就不能开发任何类型的Cocoa软件;同样地,如果您没有连接并使用Foundation框架中的类,也不能开发任何类型的Cocoa软件(当您连接Cocoa雨伞框架的时候,Xcode会自动连接这些框架)。Foundation和Application Kit框架在Cocoa开发中是必要的,其它框架则是辅助和可选的。

下面的部分将讨论上述两个核心的Cocoa框架,并简要描述一些辅助性的框架。为了使这些大框架更加容易理解,在介绍Foundation和Application Kit框架时,我们将每个层次中的数十个类分为不同的功能组。虽然这种分组方式有很强的逻辑基础,但是人们也可以按其它方式合理地进行分组。

本部分包含如下内容:

Foundation
Application Kit
带有Cocoa API的其它框架

 

Foundation

Foundation框架定义了一些基础类,可以用于各种类型的Cocoa程序。Foundation框架和Application Kit框架的区分标准在于用户界面。如果一个对象既不出现在用户界面上,也不是专门用于支持用户界面,那么它就属于Foundation框架。您可以仅用Foundation框架创建一个Cocoa程序,而不涉及其它框架;命令行工具和Internet服务器就是这样的例子。

苹果公司在设计Foundation框架时牢记如下目标:

  • 为诸如内存管理、对象改变、和通告这样的事物定义基本的对象行为和引入一致的规则。

  • 通过程序包技术和Unicode字符串(和其它技术一起)支持国际化和本地化。

  • 支持对象的持久保存。

  • 支持对象的分发。

  • 在一定程度上独立于操作系统,以支持移植。

  • 为编程的元类型提供对象封装或等价物,比如数值、字符串、和集合,以及为访问底层系统实体和服务提供工具类,比如端口、线程、和文件系统。

Cocoa应用程序定义为需要连接Application Kit框架,同时也总是必须连接Foundation框架的程序。这两个类层次都共用同一个根类,即NSObject类,很多(如果不是绝大多数的话)Application Kit的方法和函数都将Foundation对象作为参数或返回值。一些Foundation类可能看起来像是为应用程序设计的,NSUndoManagerNSUserDefaults类就是其中的两个例子,但是由于它们没有涉及到用户界面,所以被包含在Foundation框架中。

Foundation的范式和策略

Foundation为Cocoa编程引入了几个范式和策略,以保证程序中的对象在特定的环境下具有一致的行为和期望。包括:

  • 对象的所有权和对象的清除。Foundation建立了一个对象所有权策略,用以代替垃圾收集机制。该策略指定对象需要释放自己创建、拷贝、或显式保留的其它对象。NSObject(类和协议)定义了保留和释放对象的方法。自动释放池(在NSAutoreleasePool类中定义)实现了一种迟缓释放(delayed-release)机制,使Cocoa程序在处理不由调用者负责的返回对象上有一个一致的规则。

  • 可变类的变体。在Foundation中,很多值和容器类的不可变类都有一个可以修改的变体,可变类总是不可变类的子类。如果您需要动态地改变一个经过封装的值,或者改变这种对象的所属关系,可以创建一个可变类的实例。由于它是从相应的不可变类继承下来的,所以您可以在接受不可变类型参数的方法中传入可变类的实例。对象可变性的更多信息请参见"对象的可变性"部分。

  • 类簇。类簇是一个抽象类及一组私有的具体子类的组合,抽象类是这些子类的雨伞接口。根据不同的上下文(特别是创建对象所用的方法),类簇可以为您返回恰当的、经过优化的类实例。举例来说,NSStringNSMutableString就是针对不同的存储需要进行优化的各种私有子类实例的经纪类。多年来,具体类进行了几次修改,但应用程序依然可以工作。类簇的更多信息请参见"类簇"部分。

  • 通告。通告是Cocoa的主要设计模式。它基于广播机制,该机制使一个对象(称为观察者)可以在另一个对象进行某种任务或遇到某种情况时,以用户或系统事件的方式得到通告。产生通告的对象可能并不知道通告观察者的存在或身份。有几种类型的通告:同步、异步、和分布式通告。Foundation的通告机制由NSNotificationNSNotificationCenterNSNotificationQueue、和NSDistributedNotificationCenter类实现的。更多关于通告的信息请参见"通告"部分。

Foundation类

Foundation类层次的根是NSObject类,它(和NSObjectNSCopying协议一起)定义了基本的对象属性和行为。更多有关NSObject和基本对象行为的信息请参见"根类"部分。

Foundation框架的剩余部分由几组相互关联的类和一些独立的类组成。有一些代表基本数据类型的类,如字符串、字节数组、用于存储其它对象的集合类;一些代表系统信息的类,如日期类;还有一些代表系统实体的类,比如端口、线程、和进程。图1-6图1-7、和图1-8所示的类层次描述了这些类的逻辑分组及其继承关系。

图1-6  Foundation类层次—Objective-C(第一部分)

The Foundation class hierarchy?Objective-C (part one)



图1-7  Foundation类层次—Objective-C(第二部分)

Foundation class hierarchy?Objective-C (part two)



图1-8  Foundation类层次—Objective-C(第三部分)

Foundation class hierarchy?Objective-C (part three)

上面这些框图按照如下范畴(和下文提到的其它关联关系)将Foundation框架中的类进行逻辑分类:

  • 值对象。值对象封装了各种类型的数据,提供对数据进行访问和各种操作的途径。因为它们都是对象,所以可以对它们(和它们包含的数值)进行归档和分发。NSData类为字节流提供面向对象的存储空间,而NSValueNSNumber类则为简单的标量值数组提供面向对象的存储空间。NSDateNSCalendarDateNSTimeZoneNSCalendarNSDateComponents、和 NSLocale类提供代表时间、日期、日历、和地域设置(locales)的对象。它们包含的方法可以用于计算日期和时间差、以各种格式显示日期和时间、以及调整世界上各个位置时间和日期。

  • 字符串NSString是另一类值对象,负责为以null结尾的、具有特定编码的字节数组提供面向对象的存储空间。它支持对UTF-16、UTF-8、MacRoman、和很多其它编码的字符串之间进行转换。NSString还提供对字符串进行检索、组合、和比较、以及对文件系统路径进行操作的方法。您可以用NSScanner对象来对NSString对象中的数字和词进行解析。NSCharacterSet(显示在框图中的集合类部分)代表可以在各个NSStringNSScanner方法中使用的一组字符。

  • 集合。集合是以一定的顺序存储和访问其它对象(通常是数值)的对象。NSArray的索引从0开始,NSDictionary使用键-值对,而NSSet则负责对象的随机存储(NSCountedSet类使集合具有唯一标识)。通过NSEnumerator对象,您可以访问一个集合中的元素序列。集合对象是属性列表的必要元素,和其它所有对象一样,它也可以被归档和分发。

  • 操作系统服务。 很多Foundation类为访问各种底层的操作系统服务提供便利,同时又把开发者从操作系统的具体特性隔离开来。举例来说,您可以通过NSProcessInfo类查询应用程序运行的环境;通过NSHost类得到主机系统在网络中的名称和地址;通过NSTimer对象,您可以按指定的时间间隔向其它对象发送消息;NSRunLoop可以帮您管理应用程序或其它类型程序的输入源;而NSUserDefaults则为存储全局(主机级别)和用户级缺省值(预置)的系统数据库提供编程接口。

    • 文件系统和URL。 NSFileManager为诸如创建、重命名、删除、和移动文件这样的文件操作提供统一的接口。NSFileHandle则可以进行较为底层的文件操作(比如文件内查找操作)。NSBundle可以寻找存储在程序包中的资源,可以动态装载某些资源(比如nib文件和代码)。您可以用NSURLNSURLHandle类来表示、访问、和管理源于URL的数据。

    • 进程间通讯。 这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。

    • 线程和子任务。 NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或进行进度监控。

  • 通告。请见"Foundation的范式和策略"部分中的有关通告类总结。
  • 归档和序列化。这个范畴中的类使对象分发和持久保留成为可能。NSCoder及其子类和NSCoding协议一起,可以以独立于架构的方式来表示对象中包含的数据,可以将类信息和数据一起存储。
  • 表达式和条件判断。条件判断类,即NSPredicateNSCompoundPredicate、和NSComparisonPredicate类,负责对获取或过滤对象的逻辑约束条件进行封装。NSExpression对象则代表条件判断中的表达式。

  • Spotlight查询NSMetadataItemNSMetadataQuery和相关的查询类对文件系统的元数据进行封装,使元数据的查询成为可能。

  • Objective-C语言服务NSExceptionNSAssertionHandler类为代码中的断言和例外处理提供了面向对象的封装。NSInvocation对象是Objective-C消息的静态表示,您的程序可以对它存储,并在之后用于激活另一个对象的消息。undo管理器(NSUndoManager)和分布式对象(Distributed Objects)系统都用到了这种对象。NSMethodSignature对象负责记录方法的类型信息,可以用于信息的推送。NSClassDescription则是一个抽象类,用于定义和查询类的关系和属性。

  • 脚本。这个范畴中的类可以帮助您实现对AppleScript脚本和Apple Event命令的支持。

  • 分布式对象。 您可以通过分布式对象类来进行同一台电脑或一个网络中的不同电脑上的进程间通讯。其中的两个类-NSDistantObjectNSProtocolChecker的根类(NSProxy)和Cocoa其它部分的根类不同。

  • 网络NSNetServiceNSNetServiceBrowser类支持称为Bonjour的零配置网络架构。Bonjour是在IP网络上发布和浏览服务的强大系统。

Application Kit

Application Kit框架包含实现图形的、事件驱动的用户界面需要的所有对象:窗口、对话框、按键、菜单、滚动条、文本输入框—这个列表还在不断增加。Application Kit帮助您处理所有的细节,它可以高效地进行屏幕描画、和营建设备及屏幕缓冲区进行通讯,在描画之前清除屏幕上的区域,以及对视图进行裁剪。Application Kit框架中的类数量咋一看好像很吓人,但是大多数的Application Kit类都是支持类,您不必直接使用。您还可以选择在哪个级别上使用Application Kit:

  • 使用Interface Builder创建从用户界面对象到应用程序控制器对象的连接,控制器对象负责管理用户界面,协调用户界面和内部数据结构之间的数据流。为此,您可能会用到off-the-shelf控制器对象(用于Cocoa绑定),可能需要实现一个或更多的定制控制器类—特别是使用那些类的动作和委托方法。举例来说,您需要实现一个方法,使之在用户选择某个菜单项时被调用(如果该菜单项没有可接受的缺省实现的话)。

  • 以编程的方式控制用户界面,这需要对Application Kit的类和协议更加熟悉。举例来说,支持用户将图标从一个窗口拖拽到另一个窗口需要一些编程工作,而且熟悉NSDragging... 协议。

  • 通过子类化NSView或其它类实现您自己的对象。在子类化NSView时,需要用图形函数来编写自己的描画函数。子类化要求对Application Kit的工作机制有更深的理解。

Application Kit概述

Application Kit由超过125个类和协议组成。所有的类最终都从Foundation框架的NSObject类继承而来。图1-9图1-10的框图显示了Application Kit类的继承关系。

图1-9  Application Kit的类层次—Objective-C(第一部分)

Application Kit class hierarchy?Objective-C (part one)



图1-10  Application Kit的类层次—Objective-C(第二部分)

Application Kit class hierarchy?Objective-C (part two)

如您所看到的那样,Application Kit的类层次树既宽又浅,类层次中最深的类从根类开始只有五个超类,而大多数类的层次都浅得多。类层次中的一些主要分支特别有意思。

Application Kit中最大分支的根是NSResponder类,它负责定义响应者链,即对用户事件进行响应的有序对象列表。当用户进行按键或鼠标点击时,系统就会产生一个事件,并沿着响应者链向上传递,寻找可以响应该事件的对象。任何处理事件的对象都必须继承自NSResponder类。核心的Application Kit类—NSApplicationNSWindow、和NSView—都继承自NSResponder。阅读"核心应用程序架构"部分可以得到有关响应者类的更多信息。

Application Kit类的第二大分支继承自NSCell类。值得注意的是,这组类和NSControl类(继承自NSView)的派生类有大体上的映像关系。对于负责响应用户动作的用户界面对象,Application Kit采用的架构将它们的工作分为控件(control)对象和单元(cell)对象。NSControlNSCell类以及它们的子类定义了一组常见的用户界面对象,比如按键(button)、滑块(slider)、和浏览器(browser),用户可以通过图形化的操作控制应用程序的某些方面。大多数的控件对象和一个或多个单元对象相关联,单元对象负责实现描画细节和事件的处理。举例来说,一个按键是由一个NSButton对象和一个NSButtonCell对象构成的,进一步的信息请参见"控件和单元架构"部分。

控件和单元的实现机制基于Application Kit的一个重要设计模式:目标-动作(target-action)机制。单元对象可以保留用户点击(或在单元上进行某种动作)时应该发送给特定对象的消息标识信息。当用户操作一个控件时(比如用鼠标点击控件),控件就从它的单元对象抽出必要的信息,并向目标对象发送动作消息。目标-动作机制使您可以指定目标对象及应该调用的方法,从而赋予用户动作某种意义。您通常可以使用Interface Builder来对目标和动作进行设置,只要按住Control键,同时将鼠标指针从控件对象拖拽到应用程序或其它对象就可以了。您也可以通过编程的方式来设置目标和动作。

Application Kit中另一个基于设计模式的机制是委托(delegation)机制。用户界面上的很多对象,比如文本框和表视图,都定义了委托。委托对象代表被委托对象进行各种动作,或者与之相互协作,因此可以在用户界面操作中实现特定的应用程序逻辑。有关委托、目标-动作、以及Application Kit的其它范式和机制的更多信息,请参见"和对象进行通讯"部分。有关这些范式和机制的基础设计模式的讨论,请参见"Cocoa的设计模式"部分。

下面部分将简要地描述Application Kit的某些能力及其架构的某些方面,还有一些类和协议。在描述时按照图1-9图1-10所示的类层次图对类进行分组。

通用的用户界面类

在用户界面的总体功能方面,Application Kit提供了如下几个类:

  • 全局应用程序对象。 每个应用程序都使用一个NSApplication类的单件实例来控制主事件循环、跟踪应用程序的窗口和菜单、将事件分发给恰当的对象(即应用程序本身或者它的一个窗口)、建立高级别的自动释放池、以及接收应用程序级别的事件通告。NSApplication对象有一个委托对象(由您来分配),在应用程序启动或终止、被隐藏或被激活、即将打开用户选择的文件等的时候,委托对象会得到通知。通过设置NSApplication对象的委托对象并实现相应的委托方法,您就可以定制应用程序的行为,而不必生成NSApplication的子类。"核心应用程序架构"部分对这个单件应用程序对象进行详细的讨论。

  • 窗口和视图。窗口和视图类,即NSWindowNSView,继承自NSResponder类,可以对用户动作进行响应。NSApplication对象内维护着一个NSWindow对象的列表—应用程序的每个窗口都有一个对应的对象,而每个NSWindow对象都维护一些具有一定层次结构的NSView对象。视图层次用于窗口内部的描画和事件处理。NSWindow对象负责处理窗口级别的事件,将其它事件分发给窗口中的视图对象,并为视图对象提供一个描画区域。NSWindow对象也有一个委托,用于定制窗口的行为。

    NSView是显示在窗口中的所有对象的超类。所有的NSView子类都需要借助图形函数来实现自己的描画方法;drawRect:是一个基本方法,在创建新的NSView时,需要重载这个方法。

    "核心应用程序架构"部分也对NSViewNSWindow对象进行描述。

  • Cocoa绑定的控制器类NSController是一个抽象类,它的具体子类有NSObjectController、 NSArrayController、和NSTreeController,它们是Cocoa绑定实现的一部分。这个技术可以自动同步存储在对象中的应用程序数据和该数据在用户界面上的表现。有关这些类型的控制器对象的描述请参见"模型-视图-控制器设计模式" 部分。

  • 面板(对话框)NSPanelNSWindow的子类,用于显示一些短暂的、全局的、或紧急的信息。举例来说,您可以使用一个NSPanel(而不是NSWindow)的实例来显示错误信息,或请求用户对特殊或不正常的情况进行响应。Application Kit为您实现一些常用的对话框,比如Save、Open、和Print对话框,用于保存、打开、和打印文档。将这些对话框用于各种应用程序的公共操作,可以给用户一个统一的观感。

  • 菜单和光标NSMenuNSMenuItem、和NSCursor类负责定义应用程序显示给用户的菜单和光标的行为和外观。

  • 分组和滚动视图。 NSBoxNSScrollView、和NSSplitView类用于为窗口中的视图集合或其它视图对象提供图形“附件”。您可以通过NSBox类将窗口中的元素分组,并为整组元素描画一个边界。NSSplitView类可以在垂直或水平方向附加一些视图,并为每个视图分配一定的公共区域,用户可以通过滑动控制条来重新分配视图的区域。NSScrollView类及其辅助类,NSClipView,为用户提供一个滚动机制,以及让用户初始化和控制滚动的图形对象。NSRulerView类则可以为一个滚动视图添加标尺和标志。

  • 表视图和大纲视图NSTableView类以行列的方式显示数据。NSTableView可以很好地(但不仅限于)用于显示数据库记录,在这种场合下,一行对应于一条记录,列则包含记录属性。用户可以对单独的单元进行编辑,以及重新排列各个列。您可以通过设置委托和数据源对象来控制NSTableView对象的行为和内容。大纲视图(即NSOutlineView的实例,是NSTableView的子类)提供了另一种显示表格数据的方法。通过NSBrowser类,您可以为用户创建一个显示和漫游层次数据的对象。

文本和字体

NSTextField类实现了一个简单的可编辑文本输入框,NSTextView类则为更大的文本体提供更为广泛的编辑特性。

NSTextView是抽象类NSText的子类,定义了扩展文本系统的接口。NSTextView支持富文本、添附文件(图形文件及其它)、输入管理和按键绑定、以及标识文本属性,可以和Font窗口及Font菜单、标尺及段落风格、Serivces工具、还有剪贴板(Clipboard)等组件互相协作。NSTextView还允许通过委托和通告来进行定制—您很少需要从NSTextView派生出子类,也很少需要以编程的方式创建NSTextView的实例,因为Interface Builder选盘上的一些对象,比如NSTextFieldNSForm、和NSScrollView,已经包含了NSTextView对象了。

通过NSTextStorageNSLayoutManagerNSTextContainer、和其它相关的类,还可能实现更为强大、更具创造力的文本操作(比如在一个圆里进行文本编辑)。Cocoa文本系统还支持列表、表格、和非连续的文本选择。

NSFontNSFontManager类用于封装和管理字体的家族、尺寸、和变体。对于每种不同的字体,NSFont类定义一个对象与之对应。这些对象都可以表示很多数据,为了提高效率,它们可以在应用程序中的所有对象之间共享。NSFontPanel类定义了在用户界面上显示的Font窗口。

图形和颜色

NSImageNSImageRep负责封装图形数据,您可以通过这些类轻松而高效地访问存储在磁盘文件或显示在屏幕上的图像。每个NSImageRep的子类都知道如何描画特定类型的源数据代表的图像。NSImage类可以为一个图像提供多种表示,还实现了诸如缓存这样的行为。Cocoa的图像处理和描画的能力都集成在Core Image框架中。

Cocoa的颜色处理由NSColorNSColorSpaceNSColorPanelNSColorListNSColorPicker、和NSColorWell类来支持。NSColorNSColorSpace类支持一组丰富的颜色格式和表示,包括定制颜色。其它类大多是接口类,负责定义和显示的面板及视图,使用户可以选择和应用颜色。举例来说,用户可以将颜色从Color窗口拖拽到任意的颜色井(color well)。NSColorPicking协议可以用于扩展标准的Color窗口。

NSGraphicsContextNSBezierPath、和NSAffineTransform类可以实现向量描画,支持图形变换,比如缩放、旋转、和转换等。

打印和传真

NSPrinterNSPrintPanelNSPageLayout、和NSPrintInfo类一起,可以将显示在窗口或视图上信息进行打印和传真,还可以创建NSView的PDF表示。

文档和文件系统支持

NSFileWrapper类用于创建与磁盘文件或目录相对对应的对象。NSFileWrapper将文件的内容保留在内存中,以便对其进行显示、修改、以及将它传输给其它应用程序。它还提供一个图标,用于拖拽该文件或将文件表示为附件。您也可以通过Foundation框架中的NSFileManager类来访问或枚举文件和目录内容。NSOpenPanelNSSavePanel类还提供了便利和熟悉的文件系统界面。

NSDocumentControllerNSDocument、和NSWindowController类为创建基于文档的应用程序定义了一个架构(在类的层次框图中,NSWindowController类显示在用户界面组中)。这类程序可以生成包含方式相同、但具有独特排布方式的数据,这些数据可以存储在文件中。在保存、打开、复原、关闭、以及管理这些文档方面,它们具有一些内置或易于得到的能力。

国际化和字符输入支持

如果一个应用程序要在世界其它地方使用,则可能需要根据语言、国家、或文化地域对其资源进行定制或本地化。举例来说,一个应用程序可能需要有独立的日语、英语、法语、和德语版本的字符串、图标、nib文件、或上下文帮助。特定语言的资源文件被存放在程序包目录下的一个子目录下(就是那些带有.lproj扩展名的目录)。您通常可以通过Interface Builder来建立本地化资源文件。有关Cocoa国际化支持的更多信息,请参见"Nib文件和其它应用程序资源"部分。

NSInputServer类、NSInputManager类、和NSTextInput协议一起,为您的应用程序提供访问文本输入管理系统的通道。该系统负责对不同国际化键盘产生的按键进行解释,并将正确的文本字符或Control-key事件递送给文本视图对象(通常由文本类和这些类进行交互,您不必介入)。

操作系统服务

下面这些Application Kit类为您的应用程序提供操作系统支持:

  • 和其它应用程序共享数据。 NSPasteboard类定义了剪贴板,可以存储从应用程序拷贝出来的数据,并使其它希望使用该数据的应用程序可以访问。NSPasteboard实现了大家熟悉的剪切-拷贝-粘贴操作。通过剪贴板,NSServicesRequest协议为应用程序间的数据传递定义一种基于注册服务的通讯机制(剪贴板在用户界面上实现为Clipboard)。

  • 拖拽。只需要少量的编程工作,定制的视图对象就可以被拖拽到任意地方。只要遵循NSDragging...协议,对象就可以变成拖拽机制的一部分;可拖拽的对象遵循NSDraggingSource协议,而目的对象(拖拽对象的接受者)则遵循NSDraggingDestination协议。Application Kit隐藏了所有的光标跟踪和拖拽图像显示的细节。

  • 拼写检查。您可以通过NSSpellServer类来定义一个拼写检查服务,并将它作为服务提供给其它应用程序。通过NSSpellChecker类可以将您的应用程序连接到拼写检查服务上。NSIgnoreMisspelledWordsNSChangeSpelling协议用于支持拼写检查机制。

Interface Builder支持

NSNibConnector类是一个抽象类,它和两个具体子类NSNibControlConnectorNSNibOutletConnector一起,表示Interface Builder上的连接。NSNibControlConnector负责管理Interface Builder中的动作连接,NSNibOutletConnector则管理插座变量连接。

带有Cocoa API的其它框架

作为标准的Mac OS X安装的一部分,苹果系统中还包含(除了Foundation和Application Kit框架外)一些使用Cocoa编程接口的框架(它们也可能使用Carbon或其它类型的编程接口)。您可以通过这些辅助性的框架来为应用程序实现一些期望但不是必须的能力。这些重要的辅助性框架包括:

 

 

  • Core Data—Core Data框架可以帮助应用程序管理模型对象图的整个生命周期,包括关系数据库或平坦文件中数据的持久存储。该框架还包括一些其它特性,比如undo和redo的管理、值的自动正当性检查、将对象的状态改变通知其它对象、以及与Cocoa绑定的集成。

 

 

  • Sync Services—用Sync Services可以将联系人、日历和书签结构、还有您自己的应用程序数据同步起来。您还可以扩展现有的结构。

 

 

  • Address Book—这个框架为联系人和其它个人信息实现了一个中心数据库。使用Address Book框架的应用程序可以和其它应用程序分享这些联系信息,包括苹果的Mail和iChat。

 

 

  • Preference Panes—您可以通过这个框架来创建应用程序动态装载的插件,实现用于录入用户偏好设置的用户界面。这个框架可以应用到您自己或系统级的应用程序。

 

 

  • Screen Saver—Screen Saver框架可以帮助您创建Screen Effects模块,该模块可以通过系统预置(System Preferences)程序来装载和运行。

 

  • Web Kit—Web Kit框架中提供一组在窗口中显示万维网内容的核心类。它缺省实现了一些功能,比如显示用户点击的连接。

一点历史

Cocoa在很多年前被称为NeXTSTEP。NeXT电脑公司在1989年开发并发布了NeXTSTEP的1.0版本,并在之后不久推出2.0和3.0版本(分别在1990和1992年)。在这个早期的阶段,NEXTSTEP更像一个应用程序环境;这个说法指的是整个操作系统,包括窗口和图像处理系统(基于Display PostScript)、Mach内核、设备驱动程序等等。

在那个时候还没有Foundation框架。事实上根本就没有框架。相反,软件库(动态共享)被称为工具箱,那些工具箱中最突出的就是Application Kit。现在Foundation框架中的很多工作都实现为函数、结构、常量、和其它类型。Application Kit自身有一组比现在小得多的类。图1-11显示的就是NeXTSTEP 0.9 (1988)的类层次图。

图1-11  1988年的Application Kit类层次

Application Kit class hierarchy in 1988

除了Application Kit,早期的NeXTSTEP还包含Sound Kit和Music Kit,这些库中包含一组丰富的Objective-C类,通过这些类可以对Display Postscript层进行高级别的访问,实现音频和音乐合成。

在1993年早期,NeXTSTEP 3.1被移植(并发售)到Intel、Sparc、和Hewlett-Packard计算机上。NeXTSTEP 3.3也标志了一个新的大方向,因为它包含了Foundation的初级版本。大约在这个时间(1993),OpenStep的创建者也采用了表单(form)。OpenStep是Sun和NeXT的合作产物,目的是将高级别的NeXTSTEP(特别是Application Kit和Display PostScript)移植到Solaris系统上。名字中的“Open” 指的是两个公司联合发布的开放API规范。官方的OpenStep API在1994年9月发布,它第一次将API分割为Foundation和Application Kit,并且第一次使用“NS”的前缀。

在1996年6月,NeXT已经移植并发售了OpenStep 4.0版本,可以运行在Intel、Sparc、和Hewlett-Packard 计算机上,同时还有一个可以运行在Windows系统上的OpenStep运行环境。Sun也完成了OpenStep在Solaris系统上的移植,并将它作为网络对象计算环境(Network Object Computing Environment)的一部分发售。但是OpenStep一直没有成为Sun公司总体策略的重要部分。

苹果公司在1997年收购NeXT Software公司(那时的叫法)的时候,OpenStep变成一个Yellow Box,并包含在Mac OS X Server(也称为Rhapsody)和Windows系统上。之后,随着Mac OS X策略的演化,它最终将名字改为“Cocoa”。

posted @ 2012-06-21 09:29  星泥  阅读(1932)  评论(0编辑  收藏  举报