Objective-C[编辑]
Objective-C
编程范型 面向对象
发行时间 1983
设计者 布莱德·考克斯和Tom Love
实现者 苹果公司
最新发行时间 Objective-C 2.1[1] / 2007年10月26日
型态系统 静态类型、动态类型、弱类型
主要实现产品 Clang、GCC
启发语言 C、Smalltalk
影响语言 Java、Objective-J、TOM、Nu语言
操作系统 跨平台
Objective-C是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSI C编程语言,将Smalltalk式的消息传递机制加入到ANSI C中。目前主要支持的编译器有GCC和LLVM(采用 Clang作为前端)。
Objective-C的商标权属于苹果公司,苹果公司也是这个编程语言的主要开发者。苹果在开发NeXTSTEP操作系统时使用了Objective-C,之后被OS X和iOS继承下来。现在Objective-C是OS X和iOS操作系统、及与其相关的API、Cocoa和Cocoa Touch的主要编程语言。
目录 [隐藏]
1 历史
2 语法
2.1 Hello World
2.2 消息传递
2.3 类的定义与实现
2.3.1 Interface
2.3.2 Implementation
2.3.3 创建对象
2.4 协议(Protocol)
2.5 动态类型
2.6 转发
2.6.1 例子
2.6.2 脚注
2.7 类别 (Category)
2.7.1 使用分类的例子
2.7.2 注释
2.8 扮演
2.9 #import
3 语言变化
3.1 Objective-C++
3.2 Objective-C 2.0
3.2.1 垃圾收集
3.2.2 属性
3.2.3 快速枚举
4 语言分析
5 参考文献
6 外部链接
历史[编辑]
Objective-C 主要由 Stepstone 公司的布莱德·考克斯(Brad Cox)和 Tom Love 在 1980 年代发明。
1981年 Brad Cox 和 Tom Love 还在 ITT 公司技术中心任职时,接触到了 SmallTalk语言。Cox 当时对软件设计和开发问题非常感兴趣,他很快地意识到 SmallTalk语言 在系统工程构建中具有无法估量的价值,但同时他和 Tom Love 也明白,目前 ITT 公司的电子通信工程相关技术中,C 语言被放在很重要的位置。
于是 Cox 撰写了一个 C 语言的预处理器,打算使 C 语言具备些许 Smalltalk 的本领。Cox 很快地实现了一个可用的 C 语言扩展,此即为 Objective-C语言的前身。到了 1983 年,Cox 与 Love 合伙成立了 Productivity Products International(PPI)公司,将 Objective-C 及其相关库商品化贩售,并在之后将公司改名为StepStone。1986年,Cox 出版了一本关于 Objective-C 的重要著作《Object-Oriented Programming, An Evolutionary Approach》,书内详述了 Objective-C 的种种设计理念。
1988年,斯蒂夫·乔布斯(Steve Jobs)离开苹果公司后成立了 NeXT Computer 公司,NeXT 公司买下 Objective-C 语言的授权,并扩展了著名的开源编译器GCC 使之支持 Objective-C 的编译,基于 Objective-C 开发了 AppKit 与 Foundation Kit 等库,作为 NeXTSTEP 的的用户接口与开发环境的基础。虽然 NeXT 工作站后来在市场上失败了,但 NeXT 上的软件工具却在业界中被广泛赞扬。这促使 NeXT 公司放弃硬件业务,转型为销售NeXTStep(以及OpenStep)平台为主的软件公司。
1992年,自由软件基金会的 GNU 开发环境增加了对 Objective-C 的支持。1994年,NeXT Computer公司和Sun Microsystem联合发布了一个针对 NEXTSTEP 系统的标准典范,名为 OPENSTEP。OPENSTEP 在自由软件基金会的实现名称为 GNUstep。1996年12月20日,苹果公司宣布收购 NeXT Software 公司,NEXTSTEP/OPENSTEP环境成为苹果操作系统下一个主要发行版本OS X的基础。这个开发环境的版本被苹果公司称为Cocoa。
2005年,苹果电脑雇用了克里斯·拉特纳及LLVM开发团队[2],clang及LLVM成为苹果公司在GCC之外的新编译器选择,在 Xcode 4.0之后均采用 LLVM 作为默认的编译器。最新的 Objective-C 特性也都率先在 Clang 上实现。
语法[编辑]
Objective-C是C语言的严格超集--任何C语言程序不经修改就可以直接通过Objective-C编译器,在Objective-C中使用C语言代码也是完全合法的。Objective-C被描述为盖在C语言上的薄薄一层,因为Objective-C的原意就是在C语言主体上加入面向对象的特性。Objective-C的面向对象语法源于Smalltalk消息传递风格。所有其他非面向对象的语法,包括变数类型,预处理器(preprocessing),流程控制,函数声明与调用皆与C语言完全一致。但有些C语言语法合法代码在objective-c中表达的意思不一定相同,比如某些布尔表达式,在C语言中返回值为true,但在Objective-C若与yes直接相比较,函数将会出错,因为在Objective-C中yes的值只表示为1.
Hello World[编辑]
这里示范了一个基础的Hello World程序。基于Xcode 4.3.1 xcode:
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
NSLog(@"Hello World!");
}
return 0;
}
消息传递[编辑]
Objective-C最大的特色是承自Smalltalk的消息传递模型(message passing),此机制与今日C++式之主流风格差异甚大。Objective-C里,与其说对象互相调用方法,不如说对象之间互相传递消息更为精确。此二种风格的主要差异在于调用方法/消息传递这个动作。C++里类与方法的关系严格清楚,一个方法必定属于一个类,而且在编译时(compile time)就已经紧密绑定,不可能调用一个不存在类里的方法。但在Objective-C,类与消息的关系比较松散,调用方法视为对对象发送消息,所有方法都被视为对消息的回应。所有消息处理直到运行时(runtime)才会动态决定,并交由类自行决定如何处理收到的消息。也就是说,一个类不保证一定会回应收到的消息,如果类收到了一个无法处理的消息,程序只会抛出异常,不会出错或崩溃。
C++里,送一个消息给对象(或者说调用一个方法)的语法如下:
obj.method(argument);
Objective-C则写成:
[obj method: argument];
此二者并不仅仅是语法上的差异,还有基本行为上的不同。
这里以一个汽车类(car class)的简单例子来解释Objective-C的消息传递特性:
[car fly];
典型的C++意义解读是“调用car类的fly方法”。若car类里头没有定义fly方法,那编译肯定不会通过。但是Objective-C里,我们应当解读为“发提交一个fly的消息给car对象”,fly是消息,而car是消息的接收者。car收到消息后会决定如何回应这个消息,若car类内定义有fly方法就运行方法内之代码,若car内不存在fly方法,则程序依旧可以通过编译,运行期则抛出异常。
此二种风格各有优劣。C++强制要求所有的方法都必须有对应的动作,且编译期绑定使得函数调用非常快速。缺点是仅能借由virtual关键字提供有限的动态绑定能力。Objective-C天生即具备鸭子类型之动态绑定能力,因为运行期才处理消息,允许发送未知消息给对象。可以送消息给整个对象集合而不需要一一检查每个对象的型态,也具备消息转送机制。同时空对象nil接受消息后默认为不做事,所以送消息给nil也不用担心程序崩溃。
Objective-C的方法调用因为运行期才动态解析消息,一开始消息比C++ virtual成员函数调用速度慢上三倍。但经由IMP缓存改善,目前已经比C++的virtual function快上50%[来源请求]。
类的定义与实现[编辑]
Objective-C中强制要求将类的定义(interface)与实现(implementation)分为两个部分。
类的定义文件遵循C语言之惯例以.h为后缀,实现文件以.m为后缀。
|
|