iPhone开发之Objective-C类对象

[来源] 达内    [编辑] 达内   [时间]2012-06-14

在Objective-C中 ,对象标识符是一个明确的数据类型:id 这是一个通用类型,适用于任何对象,既可用于类的实例,也可用于类对象。

 iPhone开发之Objective-C类对象

在Objective-C中 ,对象标识符是一个明确的数据类型:id
这是一个通用类型,适用于任何对象,既可用于类的实例,也可用于类对象。

Objective-C中的一个方法的返回值默认是id,而不是int. 对于严格的C函数而言,返回值是int

关键字nil 作为一个null对象定义, 也就是一个值为0的id。
id,nil和其他的基本类型定义在 objc/objc.h文件中

id定义成一个指向对象数据结构的指针
typedef struct objc_object {
Class isa;
} *id;

 

所有的对象都有一个isa变量,指明它们是哪个类的实例。因为Class type被定义为一个指针
typedef struct objc_class *Class

isa变量被称为 isa指针

类对象 (Class Objects)
类定义含有不同的信息:
类名和它的超类
描述实例变量集合的模板
方法名和它们的参数,返回值的声明

编译器建立一个叫做class object的对象来表示这个类。类对象能访问所有关于这个类的信息。利用这些信息可以产生一个新的实例。
尽管类对象保留了一个类实例的原型,但它并不是实例本身。它没有自己的实例变量,也不能执行那些类的实例的方法。然而,类的定义能包含那些特意为类对象准备的方法–类方法( 而不是的实例方法)。类对象从父类那里继承类方法,就像实例从父类那里继承实例方法一样。

在源代码中,类对象由类名表示。在下面的例子中,Retangle类 用从NSObject那里继承来的方法来返回类的版本号:

int versionNumber = [Rectangle version];

只有在消息表达式中作为接收者,类名才代表类对象。其他地方,你需要要求一个实例或者类返回class id。 响应class消息:

id aClass = [anObject class];
id rectClass = [Rectangle class];

如同上面的例子显示的那样,类对象 像其他 对象一样,也是id类型。但是类对象也能指定为特定的Class data type:

Class aClass = [anObject class];
Class rectClass = [Rectangle class];

所有的类对象都是Class类型的。

类对象是一个功能完整的对象,所以也能被动态识别(dynamically typed),接收消息,从其他类继承方法。特殊之处在于它们是由编译器创建的,缺少它们自己的数据结构(实例变量),只是在运行时产生实例的代理。

编译器也会为每个类创建一个 metaclass对象。它描述了类对象,就像 类对象描述了类的实例那样。
当你发送消息给实例和类对象时,metaclass被运行时内部使用。

资源下载