LeoDLi 2011-06-17
是什么因素使一个程序成为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
Foundation框架定义了一些基础类,可以用于各种类型的Cocoa程序。Foundation框架和Application Kit框架的区分标准在于用户界面。如果一个对象既不出现在用户界面上,也不是专门用于支持用户界面,那么它就属于Foundation框架。您可以仅用Foundation框架创建一个Cocoa程序,而不涉及其它框架;命令行工具和Internet服务器就是这样的例子。
苹果公司在设计Foundation框架时牢记如下目标:
为诸如内存管理、对象改变、和通告这样的事物定义基本的对象行为和引入一致的规则。
通过程序包技术和Unicode字符串(和其它技术一起)支持国际化和本地化。
支持对象的持久保存。
支持对象的分发。
在一定程度上独立于操作系统,以支持移植。
为编程的元类型提供对象封装或等价物,比如数值、字符串、和集合,以及为访问底层系统实体和服务提供工具类,比如端口、线程、和文件系统。
Cocoa应用程序定义为需要连接Application Kit框架,同时也总是必须连接Foundation框架的程序。这两个类层次都共用同一个根类,即NSObject类,很多(如果不是绝大多数的话)Application Kit的方法和函数都将Foundation对象作为参数或返回值。一些Foundation类可能看起来像是为应用程序设计的,NSUndoManager和NSUserDefaults类就是其中的两个例子,但是由于它们没有涉及到用户界面,所以被包含在Foundation框架中。
Foundation的范式和策略
Foundation为Cocoa编程引入了几个范式和策略,以保证程序中的对象在特定的环境下具有一致的行为和期望。包括:
对象的所有权和对象的清除。Foundation建立了一个对象所有权策略,用以代替垃圾收集机制。该策略指定对象需要释放自己创建、拷贝、或显式保留的其它对象。NSObject(类和协议)定义了保留和释放对象的方法。自动释放池(在NSAutoreleasePool类中定义)实现了一种迟缓释放(delayed-release)机制,使Cocoa程序在处理不由调用者负责的返回对象上有一个一致的规则。
可变类的变体。在Foundation中,很多值和容器类的不可变类都有一个可以修改的变体,可变类总是不可变类的子类。如果您需要动态地改变一个经过封装的值,或者改变这种对象的所属关系,可以创建一个可变类的实例。由于它是从相应的不可变类继承下来的,所以您可以在接受不可变类型参数的方法中传入可变类的实例。对象可变性的更多信息请参见"对象的可变性"部分。
类簇。类簇是一个抽象类及一组私有的具体子类的组合,抽象类是这些子类的雨伞接口。根据不同的上下文(特别是创建对象所用的方法),类簇可以为您返回恰当的、经过优化的类实例。举例来说,NSString和NSMutableString就是针对不同的存储需要进行优化的各种私有子类实例的经纪类。多年来,具体类进行了几次修改,但应用程序依然可以工作。类簇的更多信息请参见"类簇"部分。
通告。通告是Cocoa的主要设计模式。它基于广播机制,该机制使一个对象(称为观察者)可以在另一个对象进行某种任务或遇到某种情况时,以用户或系统事件的方式得到通告。产生通告的对象可能并不知道通告观察者的存在或身份。有几种类型的通告:同步、异步、和分布式通告。Foundation的通告机制由NSNotification、NSNotificationCenter、NSNotificationQueue、和NSDistributedNotificationCenter类实现的。更多关于通告的信息请参见"通告"部分。
Foundation类
Foundation类层次的根是NSObject类,它(和NSObject及NSCopying协议一起)定义了基本的对象属性和行为。更多有关NSObject和基本对象行为的信息请参见"根类"部分。
Foundation框架的剩余部分由几组相互关联的类和一些独立的类组成。有一些代表基本数据类型的类,如字符串、字节数组、用于存储其它对象的集合类;一些代表系统信息的类,如日期类;还有一些代表系统实体的类,比如端口、线程、和进程。下图所示的类层次描述了这些类的逻辑分组及其继承关系。
下图为Foundation类层次—Objective-C(第一部分)
下图为Foundation类层次—Objective-C(第二部分)
下图为Foundation类层次—Objective-C(第三部分)
上面这些框图按照如下范畴(和下文提到的其它关联关系)将Foundation框架中的类进行逻辑分类:
值对象。值对象封装了各种类型的数据,提供对数据进行访问和各种操作的途径。因为它们都是对象,所以可以对它们(和它们包含的数值)进行归档和分发。NSData类为字节流提供面向对象的存储空间,而NSValue和NSNumber类则为简单的标量值数组提供面向对象的存储空间。NSDate、NSCalendarDate、NSTimeZone、NSCalendar、NSDateComponents、和 NSLocale类提供代表时间、日期、日历、和地域设置(locales)的对象。它们包含的方法可以用于计算日期和时间差、以各种格式显示日期和时间、以及调整世界上各个位置时间和日期。
字符串。NSString是另一类值对象,负责为以null结尾的、具有特定编码的字节数组提供面向对象的存储空间。它支持对UTF-16、UTF-8、MacRoman、和很多其它编码的字符串之间进行转换。NSString还提供对字符串进行检索、组合、和比较、以及对文件系统路径进行操作的方法。您可以用NSScanner对象来对NSString对象中的数字和词进行解析。NSCharacterSet(显示在框图中的集合类部分)代表可以在各个NSString和NSScanner方法中使用的一组字符。
集合。集合是以一定的顺序存储和访问其它对象(通常是数值)的对象。NSArray的索引从0开始,NSDictionary使用键-值对,而NSSet则负责对象的随机存储(NSCountedSet类使集合具有唯一标识)。通过NSEnumerator对象,您可以访问一个集合中的元素序列。集合对象是属性列表的必要元素,和其它所有对象一样,它也可以被归档和分发。
操作系统服务。 很多Foundation类为访问各种底层的操作系统服务提供便利,同时又把开发者从操作系统的具体特性隔离开来。举例来说,您可以通过NSProcessInfo类查询应用程序运行的环境;通过NSHost类得到主机系统在网络中的名称和地址;通过NSTimer对象,您可以按指定的时间间隔向其它对象发送消息;NSRunLoop可以帮您管理应用程序或其它类型程序的输入源;而NSUserDefaults则为存储全局(主机级别)和用户级缺省值(预置)的系统数据库提供编程接口。
文件系统和URL。 NSFileManager为诸如创建、重命名、删除、和移动文件这样的文件操作提供统一的接口。NSFileHandle则可以进行较为底层的文件操作(比如文件内查找操作)。NSBundle可以寻找存储在程序包中的资源,可以动态装载某些资源(比如nib文件和代码)。您可以用NSURL和NSURLHandle类来表示、访问、和管理源于URL的数据。
进程间通讯。 这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。
线程和子任务。 NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或进行进度监控。
通告。请见"Foundation的范式和策略"部分中的有关通告类总结。
归档和序列化。这个范畴中的类使对象分发和持久保留成为可能。NSCoder及其子类和NSCoding协议一起,可以以独立于架构的方式来表示对象中包含的数据,可以将类信息和数据一起存储。
表达式和条件判断。条件判断类,即NSPredicate、NSCompoundPredicate、和NSComparisonPredicate类,负责对获取或过滤对象的逻辑约束条件进行封装。NSExpression对象则代表条件判断中的表达式。
Spotlight查询。NSMetadataItem、NSMetadataQuery和相关的查询类对文件系统的元数据进行封装,使元数据的查询成为可能。
Objective-C语言服务。NSException和NSAssertionHandler类为代码中的断言和例外处理提供了面向对象的封装。NSInvocation对象是Objective-C消息的静态表示,您的程序可以对它存储,并在之后用于激活另一个对象的消息。undo管理器(NSUndoManager)和分布式对象(Distributed Objects)系统都用到了这种对象。NSMethodSignature对象负责记录方法的类型信息,可以用于信息的推送。NSClassDescription则是一个抽象类,用于定义和查询类的关系和属性。
脚本。这个范畴中的类可以帮助您实现对AppleScript脚本和Apple Event命令的支持。
分布式对象。 您可以通过分布式对象类来进行同一台电脑或一个网络中的不同电脑上的进程间通讯。其中的两个类-NSDistantObject和NSProtocolChecker的根类(NSProxy)和Cocoa其它部分的根类不同。
网络。NSNetService和NSNetServiceBrowser类支持称为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类继承而来。下面的框图显示了Application Kit类的继承关系。
下图为Application Kit的类层次—Objective-C(第一部分)
下图为Application Kit的类层次—Objective-C(第二部分)
如您所看到的那样,Application Kit的类层次树既宽又浅,类层次中最深的类从根类开始只有五个超类,而大多数类的层次都浅得多。类层次中的一些主要分支特别有意思。
Application Kit中最大分支的根是NSResponder类,它负责定义响应者链,即对用户事件进行响应的有序对象列表。当用户进行按键或鼠标点击时,系统就会产生一个事件,并沿着响应者链向上传递,寻找可以响应该事件的对象。任何处理事件的对象都必须继承自NSResponder类。核心的Application Kit类—NSApplication、NSWindow、和NSView—都继承自NSResponder。阅读"核心应用程序架构"部分可以得到有关响应者类的更多信息。
Application Kit类的第二大分支继承自NSCell类。值得注意的是,这组类和NSControl类(继承自NSView)的派生类有大体上的映像关系。对于负责响应用户动作的用户界面对象,Application Kit采用的架构将它们的工作分为控件(control)对象和单元(cell)对象。NSControl和NSCell类以及它们的子类定义了一组常见的用户界面对象,比如按键(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的子类。"核心应用程序架构"部分对这个单件应用程序对象进行详细的讨论。
窗口和视图。窗口和视图类,即NSWindow和NSView,继承自NSResponder类,可以对用户动作进行响应。NSApplication对象内维护着一个NSWindow对象的列表—应用程序的每个窗口都有一个对应的对象,而每个NSWindow对象都维护一些具有一定层次结构的NSView对象。视图层次用于窗口内部的描画和事件处理。NSWindow对象负责处理窗口级别的事件,将其它事件分发给窗口中的视图对象,并为视图对象提供一个描画区域。NSWindow对象也有一个委托,用于定制窗口的行为。
NSView是显示在窗口中的所有对象的超类。所有的NSView子类都需要借助图形函数来实现自己的描画方法;drawRect:是一个基本方法,在创建新的NSView时,需要重载这个方法。
"核心应用程序架构"部分也对NSView和NSWindow对象进行描述。
Cocoa绑定的控制器类。NSController是一个抽象类,它的具体子类有NSObjectController、 NSArrayController、和NSTreeController,它们是Cocoa绑定实现的一部分。这个技术可以自动同步存储在对象中的应用程序数据和该数据在用户界面上的表现。有关这些类型的控制器对象的描述请参见"模型-视图-控制器设计模式" 部分。
面板(对话框)。NSPanel是NSWindow的子类,用于显示一些短暂的、全局的、或紧急的信息。举例来说,您可以使用一个NSPanel(而不是NSWindow)的实例来显示错误信息,或请求用户对特殊或不正常的情况进行响应。Application Kit为您实现一些常用的对话框,比如Save、Open、和Print对话框,用于保存、打开、和打印文档。将这些对话框用于各种应用程序的公共操作,可以给用户一个统一的观感。
菜单和光标。NSMenu、NSMenuItem、和NSCursor类负责定义应用程序显示给用户的菜单和光标的行为和外观。
分组和滚动视图。 NSBox、NSScrollView、和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选盘上的一些对象,比如NSTextField、NSForm、和NSScrollView,已经包含了NSTextView对象了。
通过NSTextStorage、NSLayoutManager、NSTextContainer、和其它相关的类,还可能实现更为强大、更具创造力的文本操作(比如在一个圆里进行文本编辑)。Cocoa文本系统还支持列表、表格、和非连续的文本选择。
NSFont和NSFontManager类用于封装和管理字体的家族、尺寸、和变体。对于每种不同的字体,NSFont类定义一个对象与之对应。这些对象都可以表示很多数据,为了提高效率,它们可以在应用程序中的所有对象之间共享。NSFontPanel类定义了在用户界面上显示的Font窗口。
图形和颜色
NSImage和NSImageRep负责封装图形数据,您可以通过这些类轻松而高效地访问存储在磁盘文件或显示在屏幕上的图像。每个NSImageRep的子类都知道如何描画特定类型的源数据代表的图像。NSImage类可以为一个图像提供多种表示,还实现了诸如缓存这样的行为。Cocoa的图像处理和描画的能力都集成在Core Image框架中。
Cocoa的颜色处理由NSColor、NSColorSpace、NSColorPanel、NSColorList、NSColorPicker、和NSColorWell类来支持。NSColor和NSColorSpace类支持一组丰富的颜色格式和表示,包括定制颜色。其它类大多是接口类,负责定义和显示的面板及视图,使用户可以选择和应用颜色。举例来说,用户可以将颜色从Color窗口拖拽到任意的颜色井(color well)。NSColorPicking协议可以用于扩展标准的Color窗口。
NSGraphicsContext、NSBezierPath、和NSAffineTransform类可以实现向量描画,支持图形变换,比如缩放、旋转、和转换等。
打印和传真
NSPrinter、NSPrintPanel、NSPageLayout、和NSPrintInfo类一起,可以将显示在窗口或视图上信息进行打印和传真,还可以创建NSView的PDF表示。
文档和文件系统支持
NSFileWrapper类用于创建与磁盘文件或目录相对对应的对象。NSFileWrapper将文件的内容保留在内存中,以便对其进行显示、修改、以及将它传输给其它应用程序。它还提供一个图标,用于拖拽该文件或将文件表示为附件。您也可以通过Foundation框架中的NSFileManager类来访问或枚举文件和目录内容。NSOpenPanel和NSSavePanel类还提供了便利和熟悉的文件系统界面。
NSDocumentController、NSDocument、和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类可以将您的应用程序连接到拼写检查服务上。NSIgnoreMisspelledWords和NSChangeSpelling协议用于支持拼写检查机制。
Interface Builder支持
NSNibConnector类是一个抽象类,它和两个具体子类NSNibControlConnector和NSNibOutletConnector一起,表示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—您可以通过这个框架来创建应用程序动态装载的插件,实现用于录入用户偏好设置的用户界面。这个框架可以应用到您自己或系统级的应用程序。