Objective-C,通常写为ObjC,不太常见的是Objective C 或Obj-C,是一种扩展了C 的面向对象编程语言。它主要用于Mac OS X 和GNUstep 这两个使用OpenStep 标准的系统,并且是NeXTSTEP 和OpenStep 中的基本语言。 Objective-C 可以在运行gcc 的系统上编写和编译,因为gcc 包含一个Objective-C 编译器。 Objective-C 是Brad Cox 在他的Stepstone 公司于20 世纪80 年代初发明的。他非常关心软件设计和编程中的实际可用性问题。对Objective-C 的主要描述是他1986 年出版的《面向对象编程:一种进化方法》一书。艾迪生韦斯利。 ISBN 0-201-54834-8。
的优点和缺点
Objective-C是一门非常“现实”的语言。它使用用C 编写的小型运行时库,仅略微增加了应用程序的大小,与大多数使用大量VM 执行时间并取代整个系统操作的OO 系统形成鲜明对比。用ObjC 编写的程序通常不会比源代码大很多。函数库(通常不包含在软件发行版中)也与使用大量内存来打开窗口的Smalltalk系统形成对比。 Objective-C 的原始版本不支持垃圾收集。这是当时争论的焦点之一。很多人认为Smalltalk回收后会有很长的“死亡时间”,导致整个系统失去作用。 Objective-C没有这个功能来避免这个问题。尽管一些第三方版本已经添加了此功能(尤其是GNUstep),但Apple 尚未在其Mac OS X 10.3 中引入此功能。另一个问题是ObjC 不包含命名空间机制。相反,程序员必须为类名添加前缀,这通常会导致冲突。 2004年,在Cocoa编程环境中,所有Mac OS X类和函数都以“NS”为前缀,例如NSObject或NSButton,以在NeXTSTEP的开发过程中清楚地标识它们属于Mac OS Set。 Objective-C虽然是C的父集,但它并不将C的基本类型视为第一级对象。与C++ 不同,Objective-C 不支持运算符多重加载(它不支持临时多类型)。与C++ 也不同,但与Java 类似,Objective-C 只允许对象从一个类继承(不允许多重继承)。类别和协议可以提供多重继承的许多好处,而没有许多缺点,例如过多的额外执行时间和二进制不兼容。
Objective-C 排名
TIOBE 2010年5月编程语言排行榜近日发布。本期主要变化是Objective-C进入了前十名。虽然上个月Objective-C的份额仅达到0.08%,但它在排名中迈出了重要一步,——首次进入前十。这一步意义重大。要知道,自2001 年6 月发布TIOBE 编程排行榜以来,只有13 种编程语言进入了前十名。 Objective-C 受欢迎的主要原因可能是它是唯一可以为iPhone 和iPad 编程的语言。但单从编程语言的角度来看,诞生于1986年的Objective-c并没有表现出太多的新鲜感。
TIOBE 2010 年6 月编程语言排名近日发布,Objective-C 排名继续攀升,从第10 位上升至第9 位。可见Objective-C还有很大的发展空间。
Objective-C 和C++ 的比较
单一继承:
Objective-C不支持多重继承(与Java和Smalltalk相同),而C++语言支持多重继承。
动态的:
Objective-C是动态类型的,所以它的类库比C++更容易操作。 Objective-C 允许在运行时根据字符串名称访问方法和类,以及动态链接和添加类。
C++ 遵循Simula 67(一种早期的OO 语言)面向对象编程学派,而Objective-C 属于Smalltalk 学派。
在C++ 中,对象的静态类型决定是否可以向其发送消息,而在Objective-C 中,则由动态类型决定。 Simula 67 的思想更加安全,因为大多数错误都可以在编译时捕获。 Smalltalk学校更加灵活。例如,一些在Smalltalk中看似正确的程序无法通过Simualr 67。
在很多方面,C++ 和Objective-C 之间的区别与其说是技术上的,不如说是一种思维方式的区别。您想以牺牲灵活性为代价来获得更安全吗? Simular67学派的支持者认为,如果程序设计得好,就不需要灵活性,而Smalltalk学派则认为灵活性可以容忍更多的运行时错误。
Objective-C 简要教程
前言
在开始学习之前,假设您已经具备一些C语言的基础知识,包括变量类型、函数、返回值以及指针的相关概念。如果你还不懂这些,建议先学习谭浩强的《C程序设计》。
Objective-C 是C 语言的衍生物,继承了C 语言的所有特性。有一些例外,但它们并不是从C 本身继承的语言特性。
nil:在C/C++中你可能使用过NULL,但在Objective-C中它是nil。不同之处在于你可以将消息传递给nil(例如[nil message];),这是完全合法的,但你不能对NULL 做同样的事情。
BOOL:C 没有正式的布尔类型,并且Objective-C 中也没有“真正”的布尔类型。它包含在基础类中(即import NSObject.h;nil 也包含在此头文件中)。 BOOL 在Objective-C 中有两种类型:YES 或NO,而不是TRUE 或FALSE。
#import 与#include:正如您在hello world 示例中看到的,我们使用了#import。 gcc 编译器支持#import。我不建议使用#include。 #import 与.h 文件开头和结尾处的#ifndef #define #endif 基本相同。许多程序员都认为使用这些东西是愚蠢的。无论如何,只需使用#import。这不仅可以避免麻烦,而且如果有一天gcc 将其拿走,将会有足够多的Objective-C 程序员坚持保留它或将其放回去。偷偷告诉你,Apple在他们的官方代码中也使用了#import。所以如果有一天出现这种情况,不难预测苹果会提供支持#import的gcc分支版本。
在Objective-C 中,“方法”和“消息”这两个词可以互换。但消息有其特殊性,具体区别稍后介绍。
编译hello worldhello.m#importintmain(intargc,constchar*argv[]){printf('helloworld
');返回0;}
输出
你好世界
在Objective-C 中使用#import 代替#include
Objective-C的默认文件扩展名是.m
创建课程
@界面
基于《Programming in Objective-C》一书中的示例,版权所有(C) 2004,Sams Publishing 并经许可出版。 Fraction.h#import@interfaceFraction:NSObject{intnumerator;intdenominator;}-(void)print;-(void)setNumerator:(int)n;-(void)setDenominator:(int)d;-(int)numerator;- (int)分母;@end
NSObject:NeXTStep 对象的缩写。由于它已更名为OpenStep,因此今天这没有多大意义。
继承是用Class:Parent来表示的,就像上面的Fraction:NSObject一样。
@interface ClassParent { . } 中夹着的称为实例变量。
未设置访问权限(受保护、公开、私有)时,默认访问权限受到保护。稍后会解释如何设置权限。
实例方法跟随成员变量(即实例变量)。格式为:scope(returnType)methodName:(parameter1Type)parameter1Name;范围有两种类型:类或实例。
实例方法以-开头,类级方法以+开头。
接口以@end结束。
原生Hello World 代码#importintmain(intargc,constchar*argv[]){NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];//在此处插入代码.NSLog(@'Hello,World!');[pooldrain];return0 ; }
以上是Xcode开发环境中默认的.m文件内容,即原生的Hello World示例代码。
更多关于hello world的扩展内容
Objective-C 中#import 和#include 的区别
在Objective-C 中,#import 用作#include 指令的修改版本。此外,#import 确保文件只能导入一次,因此不会出现递归包含问题。使用哪一个仍然取决于您。一般来说,导入Objective-C头文件时使用#import,包含C头文件时使用#include。