Objective-C

来自站长百科
跳转至: 导航、​ 搜索

Objective-C,通常写作ObjC和较少用的Objective CObj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS XGNUstep这两个使用OpenStep标准的系统,而在NeXTSTEPOpenStep中它更是基本语言。Objective-C可以在gcc运作的系统写和编译,因为gcc含[[[Objective-C]]的编译器。1980年代初布莱德·确斯(Brad Cox)在其公司Stepstone发明Objective-C。他对软件设计和编程里的真实可用度问题十分关心。Objective-C最主要的描述是他1986年出版的Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.

语言特点[ ]

Objective-C用途:编写iphone应用程序的利器 Tiobe在今年7月的编程语言排行榜中有一个显著变化是:一直在50名左右的Objective-C排名大幅提升,它的流行当归功于iphone的成功,因为Objective-C一直被用于编写iphone应用程序。

Objective-C是非常实际的语言。它使用一个用C写成、很小的运行库,只会令应用程序的大小增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反。ObjC写成的程序通常不会比其原始码大很多。而其函式库(通常没附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。


Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的死亡时间,令整个系统失去功用。Objective-C为避免此问题才不拥有这个功能。虽然某些第三方版本已加入这个功能(尤是GNUstep), Apple在其Mac OS X 10.3中仍未引入这个功能。

另一个问题是ObjC不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类别和函式均有NS作为前缀,例如NSObject或NSButton来清楚分辨它们属于Mac OS X核心;使用NS是由于这些类别的名称在NeXTSTEP开发时定下。

虽然Objective-CC的母集,但它也不视C的基本型别为第一级的对象。

Objective-C同C++的异同:

和C++不同,Objective-C不支持运算子多载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。

优点与缺点[ ]

Objective-C是非常“实际”的语言。它使用一个用C写成、很小的运行库,只会令应用程序的大小增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反。ObjC写成的程序通常不会比其原始码大很多。而其函式库(通常没附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。

Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的“死亡时间”,令整个系统失去功用。Objective-C为避免此问题才不拥有这个功能。虽然某些第三方版本已加入这个功能(尤是GNUstep), Apple在其Mac OS X 10.3中仍未引入这个功能。不过令人欣慰的是在Apple发布的xCode4中已经支持自动释放啦,我不敢冒昧地说那是垃圾回收,因为两者机制不同,在xCode4中的自动释放,也就是ARC(Automatic Reference Counting)机制,是不需要用户手动去Release一个对象,而是在编译期间,编译器会自动帮你添加那些以前你经常写的[NSObject release]。

另一个问题是ObjC不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类别和函式均有“NS”作为前缀,例如NSObject或NSButton来清楚分别它们属于Mac OS X核心;使用“NS”是由于这些类别的名称在NeXTSTEP开发时定下。

虽然Objective-C是C的母集,但它也不视C的基本型别为第一级的对象。

和C++不同,Objective-C不支援运算子多载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类别(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。

由于Obj-C使用动态运行时类型,而且所有的方法都是函数调用(有时甚至连系统调用(syscalls)也如此),很多常见的编译时性能优化方法都不能应用于Obj-C(例如:内联函数、常数传播、交互式优化、纯量取代与聚集等)。这使得Obj-C性能劣于类似的对象抽象语言(如C++)。不过Obj-C拥护者认为既然Obj-C运行时消耗较大,Obj-C本来就不应应用于C++或Java常见的底层抽象。

简单代码[ ]

01 #import <Foundation/Foundation.h>

02

03 int main (int argc, const char * argv[]) {

04 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

05

06 // insert code here...

07 NSLog(@"Hello, World!");

08 [pool drain];

09 return 0;

10 }

以上是Xcode开发环境下默认的.m文件内容,就是原生的Hello World范例代码。

关于hello world的更多扩展内容

在 Objective-C 中 #import 和 #include 的区别

在 Objective-C 中,#import 被当成 #include 指令的改良版本来使用。除此之外,#import 确定一个文 件只能被导入一 次,这使你在递归包含中不会出现问题。使用哪一个还是由你来决定。一般来说,在导入 Objective-C 头文件的时候使用 #import,包含 C 头文件时使用 #include。

未来发展[ ]

2011年已经过去一半,从市场占有率来看,有一种语言脱颖而出,那就是Objective-C,相对2010年增长了2.68%,亚军则是Lua,增长率为1.04% ,如果按这个走势下去,2012年的1月,Lua也将和现在的Objective-C一样,成为年度语言。

2010年的4月,TIOBE世界编程语言排行榜的前20名。Objective-C则从第8一路飙升,超越了C#,占据了第4的位置。

2012年的7月,Objective-C首度超越了C++,取代C++成为排行榜的第3位,成为新科探花。

2013年的1月,Objective-C 连续第 2 年获得“年度语言”殊荣。年度语言是指在上一年份额增长最多的语言。Objective-C 最新的份额为 10.283%,比去年同期增长了 3.37%。


相关条目[ ]

参考来源[ ]