Cocoa :苹果研发的面向对象开发框架

更新时间:2023-10-31 13:45

Cocoa是苹果公司Mac OS所创建的原生面向对象的应用程序接口,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。Cocoa应用程序一般在苹果公司的开发工具Xcode(前身为Project Builder)和接口 Builder上用Objective-C写成。不过,通过Java bridge、PasCocoa、PyObjC、CamelBones以及RubyCocoa等桥接技术,Java、Clozure CL、LispWorks、Object Pascal、PythonPerl、Ruby等其它工具或者语言也可以用来开发Cocoa应用。也有一些其它语言的Cocoa实现无须桥接,比如苹果公司开发的MacRuby和类似LISP的Nu语言。不使用Xcode接口 Builder,仅仅通过文本编辑器、GCC和GNU make工具也可以用Objective-C语言开发Cocoa应用。对最终用户来说,使用Cocoa编程环境开发的应用程序即为Cocoa应用程序。这类应用有独特的外观,因为Cocoa编程环境让程序在多方面自动遵循苹果公司的人机交互守则。

历史沿革

Cocoa的历史可以追溯至1980年代由NeXT开发的编程环境NeXTSTEP和OPENSTEP。苹果公司在1996年12月收购了NeXT后,将其大量工作转化为Mac OS X,其中最为显著的就是Cocoa。尽管如此,两者之间仍存在差异,如NeXTSTEP和OPENSTEP使用的Display PostScript实现文字和图形的屏幕显示,而Cocoa则依赖苹果的Quartz(基于PDF的绘图模型)。Cocoa这一术语曾被用于命名一款帮助儿童创建多媒体工程的应用程序,但在该应用停产后,该名称被重新用于当前的用途。

开发过程

Cocoa的开发过程中,Xerox PARCsmalltalk开发小组提出了“模型-视图-控制器”(MVC)的设计哲学,这是一种能够简化开发过程、提高代码重用率的设计理念。Cocoa严格遵守了MVC的原则,最初在OpenStep中,大多数类要么是高层的视图类(AppKit),要么是相对底层的模型类(Foundation)。随着Cocoa的发展,模型层得到了极大的扩展,引入了许多新类,以提供常见的桌面程序功能。在Mac OS X 10.3中,苹果公司引入了NSController系列类,这是Cocoa绑定系统的一部分,该系统还允许使用键-值-观测器和键-值-绑定协议进行扩展。在Mac OS X 10.4中,苹果引入了Core Data框架,进一步扩展了这一概念,使更改跟踪和模型层的持久化标准化,从而简化了应用程序数据的更改、撤销、保存和读取过程。

动态绑定

Cocoa采用了Objective-C的动态绑定特性,这增加了设计的灵活性。在Objective-C中,消息由selector表示,这是一个描述需要调用的方法的字符串。在发送消息时,selector被发送到Objective-C运行时中,在可用方法列表中查找相应的方法,然后调用其实现。由于selector是文本数据,因此它可以保存在文件中,通过网络或在进程间传输,或以其他方式进行操作。方法的实现是在运行时查找的,而非编译时。这种做法会导致一定的性能损失,但动态绑定允许相同的selector代表不同的实现。利用这些特性,Cocoa提供了一种通用的数据管理技术,称为键-值编码(KVC)。这种技术允许对象的数据或属性可以在运行时通过其键名进行查找,其中,属性的名称即为其值的键名。在静态语言中,这样的做法是不可能的。KVC极大地增加了设计的自由度:通过KVC,无需知道对象的类型即可访问其属性或数据。此外,利用键-值-观测器(KVO)技术和NSUndoManager类,可以提供自动的撤销/重做支持。

内存管理

Cocoa环境中的一项特点是它可以管理动态分配的内存。Cocoa中绝大部分类的基类都是NSObject,它实现了引用计数的内存管理模型。从NSObject继承的类可以响应retain和release消息,以增减其引用计数;也可以通过发送retainCount消息来获取其引用计数。一个以alloc,copy或Objective-C 2.0中新增的new所创建的对象的引用计数为1;向对象发送retain消息会将计数加1,而发送release消息则会将计数减1。若对象的引用计数减少到了0,则它会被销毁。dealloc消息类似于C++中的析构函数,在对象被销毁之前可能会被调用,但系统不保证会发送该消息。这种引用计数的模型与微软的COM中的IUnknown接口特性非常相似,它提供了AddRef和Release接口,与retain和release对应。从Objective-C 2.0开始,Objective-C运行时实现了可选的垃圾收集器。若垃圾收集的特性被激活,则运行时会将引用计数相关的操作,例如“retain”和“release”,变为无操作。IOS上的Objective-C 2.0实现中不包含垃圾收集器。垃圾收集器运行在一个低优先级的后台线程中,并可以在用户动作时暂停,从而保持良好的用户体验。

主要框架

Cocoa包含三个主要的Objective-C对象库,称为“框架”。框架的功能类似于动态库,即可以在运行时动态地载入应用程序的地址空间,但框架作为一个捆绑而非独立文件,其中除了可执行代码外,也包含了资源、头文件和文档。“Foundation工具包”,或简称为“Foundation”,首先出现在OpenStep中。在Mac OS X中,它是基于Core Foundation的。作为通用的面向对象的函数库,Foundation提供了字符串、数值的管理、容器及其枚举、分布式计算、事件循环,以及一些其它的与图形用户界面没有直接关系的功能。其中用于类和常数的“NS”前缀来自于Cocoa的来源,NeXTSTEP。它可以在Mac OS X和IOS中使用。“应用程序工具包”,或称AppKit(Application Kit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序与图形用户界面交互所需的代码。它是基于Foundation建立的,也使用“NS”前缀。它只能在Mac OS X中使用。“用户界面工具包”,或称UIKit(User 接口 Kit),是用于iOS的图形用户界面工具包。与AppKit不同,它使用“UI”的前缀。Cocoa架构的一个关键部分是其多样化的视图模型。总体而言,它是基于由Quartz提供的PDF绘制模型的,该特性允许使用PostScript绘制自定义图形内容,同时也自动的支持了打印机以及类似设备。由于Cocoa框架管理了全部的绘图操作,例如裁剪、滚动、缩放等,程序员可以不再重复实现基础的功能,而可以集中于提供程序的关键功能上。

基础对象

Cocoa中最常用的特性是系统提供的强大“基础对象”,例如Foundation中的NSString和NSAttributedString类,提供了Unicode字符串的支持;而AppKit中的NSText系统则允许程序员在GUI中放置字符串对象。NSText及其相关类是用于显示和编辑字符串的。这些对象允许程序实现简单的单行文本框,也可以实现完整的多页、多栏文本显示方案,方案同时可以提供支持完整的专业排版特性,例如压缩字符、合字、环绕形状的文字、旋转、完整的Unicode支持和反锯齿字形渲染。段落格式可以自动控制或由用户自定义;可以使用内置的“ruler”对象附加到任何文本视图上。这些类也有自动拼写检查特性,该特性使用一个由所有程序共享的字典。另外,也允许无限制数量的撤销/重做操作。只使用内置的特性,任何人都可以只用不到10行代码写出一个具备上述特性的文本编辑器,而若使用Cocoa绑定,甚至可以不用写一行代码。若需要对已有特性进行扩展,Objective-C中的类别特性使得这项操作变得相当容易。通过类别可以直接对已有类进行功能添加,而无需对其进行更改或获得其源代码。一般而言,这样的目的需要通过继承原有的类并修改原有的代码,将原有的类以新的子类代替来完成。

实现

Cocoa本身由Objective-C语言写成,因此Objective-C是开发Cocoa应用的首选语言。虽然也提供Java到Cocoa的绑定,但是在开发者中并未得到广泛采用。而且,由于使用桥接机制,Java的绑定并不能全面利用Cocoa的所有功能。2005年,苹果公司宣布Java的Cocoa绑定在Mac OS X 10.4和之后版本中属被废弃的技术。换句话说,Cocoa API中可能会逐渐出现不支援Java的功能。作为Xcode一部分的AppleScript Studio工具允许用户和开发者用AppleScript编写一些简单的Cocoa应用。第三方实现的绑定有Clozure CL、LispWorks、PyObjC(Python)、RubyCocoa(Ruby)、CamelBones(Perl)、Cocoa#、Monobjc(C#)和NObjective(C#)。Nu语言直接使用Objective-C的对象模型,所以无须绑定就可以调用Cocoa API。也有开源项目把Cocoa的大部分在其它操作系统上实现(包括Windows),从而使开发跨平台的Cocoa应用成为可能。比如GNUstep和Cocotron。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}
友情链接: