您的位置:首页 > 移动开发 > Objective-C

iPhone开发之Objective-C类对象

2012-06-20 12:14 232 查看
在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被运行时内部使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: