3.2 Objective-C的优点及缺点

知识点讲解光盘:视频\知识点\第3章\Objective-C的优点及缺点.mp4

Objective-C是一门非常“实际”的编程语言,它使用一个用C写成的很小的运行库,只会令应用程序的大小增加很小,这和大部分OO(面向对象)系统那样使用极大的VM(虚拟机)执行时间来取代整个系统的运作相反。Objective-C写成的程序通常不会比其原始代码大很多。

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

还有另外一个问题,Objective-C不包括命名空间机制,取而代之的是程序设计师必须在其类别名称上加上前缀,这样会经常导致冲突。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不但可以提供很多多重继承的好处,而且没有太多缺点,例如额外执行时间过长和二迚制不兼容。

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