Cocoa

title: Cocoa历史.
content: Cocoa是从1980年代由NeXT开发的编程环境NeXTSTEP和OPENSTEP演变而来,这点可由其类别之名皆以NS前缀(代表NeXTSTEP)看出端倪。苹果电脑公司在1996年12月收购了NeXT。开发NeXTSTEP和OPENSTEP的大量工作都转化到了Mac OS X中,最显而易见的部分当属Cocoa。但差异也存在。例如,NeXTSTEP和OPENSTEP使用Display PostScript实现文字和图形的屏幕显示,而Cocoa依赖苹果的Quartz(基于PDF的绘图模型)。  Cocoa这个名词曾经被用来称呼一款帮助儿童创建多媒体工程的应用程序。随后该应用停产。该名称被用作现在的用途。
title: 内存管理.
content: Cocoa环境的一个特点是它可以管理动态分配的内存。Cocoa中绝大部分类的基类都是NSObject,它实现了引用计数的内存管理模型。从NSObject继承的类可以响应codice_1和codice_2消息,以增减其引用计数;也可以通过发送codice_3消息来获取其引用计数。一个以codice_4,codice_5或Objective-C 2.0中增加的codice_6所创建的对象的引用计数为1;向对象发送codice_1消息会将计数加1,而发送codice_2消息则会将计数减1。若对象的引用计数减少到了0,则它会被销毁。codice_9消息类似于C++中的析构函数,在对象被销毁之前可能会被调用,但系统不保证会发送该消息。这种引用计数的模型与微软的COM中的IUnknown接口特性十分相似,它提供了codice_10和codice_11接口,与codice_1和codice_2对应。  从Objective-C 2.0开始,Objective-C运行时实现了可选的垃圾收集器。若垃圾收集的特性被激活,则运行时会将引用计数相关的操作,例如“retain”和“release”,变为无操作。iOS上的Objective-C 2.0实现中不包含垃圾收集器。垃圾收集器运行在一个低优先级的后台线程中,并可以在用户动作时暂停,从而保持良好的用户体验。
title: 主要框架.
content: Cocoa包含三个主要的Objective-C对象库,称为“框架”。框架的功能类似于动态库,即可以在运行时动态的载入应用程序的地址空间,但框架作为一个捆绑而非独立文件,其中除了可执行代码外,也包含了资源,头文件和文档。  Cocoa构架的一个关键部分是其多样的视图模型。总体而言,它是基于由Quartz提供的PDF绘制模型的,该特性允许使用PostScript绘制自定义图形内容,同时也自动的支持了打印机以及类似设备。由于Cocoa框架管理了全部的绘图操作,例如裁剪,滚动,缩放等,程序员可以不再重复实现基础的功能,而可以集中于提供程序的关键功能上。
title: 模型-视图-控制器.
content: 施乐帕罗奥多研究中心的Smalltalk开发小组最终发明了一种可以简化开发过程,提高代码重用率的设计哲学,即“模型-视图-控制器”模式(MVC)。这种模式将应用程序分为三个可以交互的对象集,即模型,视图和控制器。其中,模型类代表原始数据,例如文档、设置、文件、内存中的对象等,视图是模型中数据的可视化表现,而控制器类则包含了将模型和其对应视图连接起来的逻辑,并保持前二者的状态同步。  Cocoa的设计遵循了严格的MVC原则。在OpenStep下,绝大多数的类要么是高层的视图类(AppKit),或者是相对底层的模型类(Foundation)。与类似的MVC系统相比,OpenStep没有强的模型层,例如它不包含表示“文档”的存储类。在向Cocoa迁移的过程中,模型层被大大扩展了,引入了一系列的类,它们提供了一些桌面程序所需的常用功能。  在Mac OS X 10.3中,苹果引入了NSController系列类以提供预定义的控制器层。这些类是Cocoa绑定系统的一部分,该系统也允许使用类似键-值-观测器和键-值-绑定协议来对其进行扩展。其中,“绑定”的概念表明两个对象(通常是视图和控制器)之间的关系。绑定使得开发者可以集中于定义这种关系,而不是编写大量的“胶水代码”来实现这些关系。  在Mac OS X 10.4中,苹果引入了Core Data框架,进一步扩展了这种概念。Core Data标准化了对更改的追踪和模型层的保存行为。因此,该框架大大简化了改变应用程序数据,撤销更改,在磁盘中保存和读取数据的过程。  通过提供对MVC模型中全部3层的框架支持,苹果的目的在于减少程序员所需编写的“胶水代码”量,以解放这些资源而用于程序的真正特性。
title: 动态绑定.
content: 在多数面向对象的编程语言中,调用方法是由直接调用内存中一段固定的代码实现的。由于这种方法需要预定义的处理命令的类,因而限制了程序的设计,通常采用责任链模式作为其设计模式。虽然Cocoa在多数地方仍然采用这种方式,但通过Objective-C的动态绑定特性增加了更多设计的自由性。  在Objective-C中,消息由selector所代表,其为描述需要调用的方法的一个字符串。在发送消息时,该selector被送入Objective-C运行时中,在可用方法列表中寻找对应的方法,然后调用该方法的实际实现。由于selector只是文本数据,因此它可以保存在文件中,通过网络或在进程间传输,或以其它方式进行操作。方法的实现是在运行时查找的,而非编译时。这样的做法会造成一些性能损失,但动态绑定允许相同的selector代表不同的实现。  利用这些特性,Cocoa提供了一种通用的数据管理技术,称为键-值编码(KVC)。这种技术允许对象的数据或属性可以在运行时通过其键名进行查找,其中,属性的名称即为其值的键名。在静态语言中,这样的做法是不可能的。KVC大大的增加了设计的自由度:通过KVC,无需知道对象的类型即可访问其属性或数据。另外,利用键-值-观测器(KVO)技术和NSUndoManager类,可以提供自动的撤销/重做支持。
title: Rich objects.
content: Cocoa中最有用的特性是系统提供的强大的“基础对象”,例如Foundation中的codice_14和codice_15类,提供了Unicode字符串的支持;而AppKit中的codice_16系统则允许程序员在GUI中放置字符串对象。  codice_16及其相关类是用于显示和编辑字符串的。这些对象允许程序实现简单的单行文本框,也可以实现完整的多页,多栏文本显示方案,方案同时可以提供支持完整的专业排版特性,例如压缩字符,合字,环绕形状的文字,旋转,完整的Unicode支持和反锯齿字形渲染。段落格式可以自动控制或由用户自定义;可以使用内建的“ruler”对象附加到任何文本视图上。这些类也有自动拼写检查特性,该特性使用一个由所有程序共享的字典。另外,也允许无限制数量的撤销/重做操作。只使用内建的特性,任何人都可以只用不到10行代码写出一个具备上述特性的文本编辑器,而若使用Cocoa绑定,甚至可以不用写一行代码。  若需要对已有特性进行扩展,Objective-C中的类别特性使得这项操作变得相当容易。通过类别可以直接对已有类进行功能添加,而无需对其进行更改或获得其源代码。一般而言,这样的目的需要通过继承原有的类并修改原有的代码,将原有的类以新的子类代替来完成。
title: 实现.
content: 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。

Summary: Cocoa是苹果公司为macOS所创建的原生面向对象的应用程序接口,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。

Cocoa (Apple): Cocoa est une API native d'Apple pour le développement orienté objet sur son système d'exploitation Mac OS X. C'est l'une des cinq API majeures disponibles pour Mac OS X, les autres étant : Carbon, la boîte à outils Macintosh (pour l'environnement obsolète Classic), POSIX (pour l'environnement BSD) et Java. Certains environnements, comme Perl et Ruby sont considérés comme mineurs, car ils n’ont pas accès à toutes les fonctionnalités et ne sont généralement pas utilisés pour le développement d'applications à part entière.