What Is Cocoa?
Cocoa是OS X和iOS操作系统的应用程序环境。它由面向对象类库、运行时和集成开发环境组成。
The Cocoa Environment
Cocoa是一个面向对象框架集,为OS X和iOS应用程序提供了一个运行时环境。Cocoa是OS X上一个出众的应用程序环境,并且是iOS上唯一的应用程序环境。
Introducing Cocoa
与所有应用程序环境一样,Cocoa有运行时和开发两个方面。
在运行时方面,Cocoa应用程序展示用户界面,并且与操作系统其它可视化组件紧密集成;如在OS X中,这些应用有Finder,Dock及其它应用程序。
但是,程序员更感兴趣的是开发方面。Cocoa提供了一个类库用于创建应用程序。
在开发 Cocoa 软件的时候,您可以使用多种编程语言。基本的语言是 Objective-C。Objective-C 拥有自己 的 Cocoa 运行环境,是 ANSI C 的超集,它在 ANSI C 的语法和语义特性上进行扩展,使之支持面向对象的编程。由于 Objective-C 是基于 ANSI C 的,您可以自由地将 C 代码直接和 Objective-C 代码混合在一起。而且,您的代码可以调用非 Cocoa 的编 程接口中定义的所有函数,比如 Carbon 和 BSD。您甚至可以将 C++代码混合到 Cocoa 代码中,并将它们 连接在同一个执行文件中。
最重要的是Cocoa类库,它为OS X提供了Foundation和AppKit两个框架,为iOS提供了Foundation和UIKit两个框架。和所有框架一样,这两个框架不仅包含动态共享库(有时是几个兼容版本的库),还包含头文件、API文档、和相关的资源。Foundation和AppKit或UIKit将Cocoa可编程接口分为非图形用户接口相关和图形用户接口相关两部分。
How Cocoa Fits into OS X
Cocoa in the architecture of OS X
How Cocoa Fits into iOS
Cocoa in the architecture of iOS
通常,iOS的系统库和框架包括UIKit是OS X上系统库和框架的子集。
下面是iOS架构上每一层的简要总结:
- Core OS.
这一层包含了内核、文件系统、基础网络、安全、电源管理和各种设备驱动。它也包含了一些系统库。 - Core Services.
这层框架提供了核心服务,比如字符串处理、集合管理、网络、URL工具、联系人管理和首选项等。同样提供了设备硬件特性的服务,比如GPS,加速计等。包括了Core Location,Core Motion和System Configuration.
这一层包含了Foundation和Core Foundation框架,为通用数据类型提供抽象,比如字符串和集合。也包含了Core Data,对象持久化框架。 - Media.
这层框架依赖Core Services 层,为Cocoa Touch层提供绘图和多媒体服务。包括Core Graphics,Core Text,OpenGL ES,Core Animation,AVFoundation,Core Audio,video playback. - Cocoa Touch.
这层框架直接支持iOS应用程序,包括Game Kit,Map Kit,iAd等。
Cocoa Touch和Core Services层都有Objective-C框架,对iOS应用程序是极其重要的,是iOS上的核心框架。 - UIKit。
这个框架提供了在用户界面上显示的对象和为程序行为定义结构,包括事件处理和绘图。 - Foundation.
这个框架定义了对象的基本行为,为它们的管理建立机制,提供基础数据类型,集合,和操作系统服务。Foundation本质上是Core Foundation的面向对象版本。
The Cocoa Frameworks
是什么使用一个程序成为Cocoa程序呢?不是某个语言,因为在Cocoa开发中可以使用几种语言,也不是某个开发工具,因为可以使用命令行创建Cocoa程序。那么,Cocoa程序的共同点是什么呢?使它们独具特色的是它们都是由继承自根类NSObject的对像组成,并且最终都基于Objective-C运行时,这种说法对于所有Cocoa框架都是正确的。
- OS X: Foundation and AppKit
- iOS: Foundation and UIKit
Foundation
Foundation框架定义了基础类库可用于任何类型的Cocoa程序。
Foundation框架基于下面一些目标来设计:
- 为诸如内存管理、对象改变、和通告这样的事物定义基本的对象行为和引入一致的规则。
- 通过程序包技术和 Unicode 字符串(和其它技术一起)支持国际化和本地化。
- 支持对象的持久保存。
- 支持对象的分发。
- 在一定程度上独立于操作系统,以支持移植。
- 为编程的元类型提供对象封装或等价物,比如数值、字符串、和集合,以及为访问底层系统实体 和服务提供工具类,比如端口、线程、和文件系统。
Foundation Paradigms and Policies
Foundation 为 Cocoa 编程引入了几个范式和策略,以保证程序中的对象在特定的环境下具有一致的行为 和期望。包括:
- 对象的所有权和对象的清除。Foundation 建立了一个对象所有权策略,用以代替垃圾收集机制。 该策略指定对象需要释放自己创建、拷贝、或显式保留的其它对象。NSObject(类和协议)定义了 保留和释放对象的方法。自动释放池(在 NSAutoreleasePool 类中定义)实现了一种迟缓释放 (delayed-release)机制,使 Cocoa 程序在处理不由调用者负责的返回对象上有一个一致的规则。
- 可变类的变体。在Foundation中,很多值和容器类的不可变类都有一个可以修改的变体,可变类 总是不可变类的子类。如果您需要动态地改变一个经过封装的值,或者改变这种对象的所属关系,可 以创建一个可变类的实例。由于它是从相应的不可变类继承下来的,所以您可以在接受不可变类型参 数的方法中传入可变类的实例。
- 类簇。类簇是一个抽象类及一组私有的具体子类的组合,抽象类是这些子类的雨伞接口。根据不 同的上下文(特别是创建对象所用的方法),类簇可以为您返回恰当的、经过优化的类实例。举例来 说,NSString和NSMutableString就是针对不同的存储需要进行优化的各种私有子类实例的经纪 类。
- 通知。通知是Cocoa的主要设计模式。它基于广播机制,该机制使一个对象(称为观察者)可以 在另一个对象进行某种任务或遇到某种情况时,以用户或系统事件的方式得到通告。产生通告的对象 可能并不知道通告观察者的存在或身份。有几种类型的通告:同步、异步、和分布式通告。Foundation 的通告机制由NSNotification、NSNotificationCenter、NSNotificationQueue、和 NSDistributedNotificationCenter类实现的。
Foundation Classes
Foundation类层次的根是NSObject类,它(和NSObject及NSCopying协议一起)定义了基本的对象属性 和行为。
The Foundation class hierarchy,(蓝色部分是OS X和iOS共有的,灰色部分是OS X独有的)
将这些类进行逻辑分组,这些组中特别重要的类是值对象和集合:
- 值对象。
值对象封装各种基元类型的值,包括strings, numbers(integers and floating-point values), dates, structures, pointers.它们以适当的方式间接访问值和操纵它们。当你比较同一类型的值对象时,比较的是封装的值,而不是它们的指针值。值对象经常是其它对象的属性,包括自定义的对象。
当然,你可能在程序中直接使用标量和其它基元类型。
一些值对象的类有不变和可变之分,例如:NSData and NSMutableData,不可变的对象值不能改变。
下面是值对象的要点描述:- NSValue类的实例包装了ANSI C或Objective-C数据,例如,标量类型如及指针和结构的浮点数据
- NSNumber是NSValue的子类,对数值的包装,如 int,float,double
- NSData为字节流提供面向对象的存储。这个类中提供了写和读文件系统的方法
- 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 对象,您可以访问一个集合中的元素序列。集合对象是属性列表 的必要元素,和其它所有对象一样,它也可以被归档和分发。 - 操作系统服务。
- 通知。
- 归档和序列化。
- 表达式和条件判断。
- Objective-C 语言服务。
- XML processing.
- Spotlight queries.
- Distributed objects.