6

我对 Objective-Cid类型的理解是它是一个指向未知类型对象的指针。在我看来,它就像 Objective-C 类的 void* ,顶部有一些编译器糖,用于类型检查之类的东西。我的问题是为什么它id*不是idthen ,因为它是指针类型?如果这是 Java 或 C#,其中没有使用 an 声明对象引用,*那么我就不会那么惊讶了。但是在 Objective-C 中,每个类都被 C 风格的指针引用,那么为什么要隐藏*未知对象类型呢?

4

1 回答 1

11

id typedef已经是一个指针:

typedef struct objc_object {
    Class isa;
} *id;

来自Objective-C 编程语言

在 Objective-C 中,对象标识符是一种不同的数据类型:id. 这种类型是任何类型的对象的通用类型,无论类如何,并且可以用于类的实例和类对象本身。

id anObject;

对于 Objective-C 的面向对象构造,例如方法返回值,id 替换 int 作为默认数据类型。(对于严格的 C 构造,例如函数返回值,int 仍然是默认类型。)

关键字nil被定义为一个空对象,一个值为0的id。id、nil以及Objective-C的其他基本类型在头文件objc/objc.h中定义。

id 被定义为指向对象数据结构的指针:

typedef struct objc_object {
    Class isa;
} *id;

因此,每个对象都有一个 isa 变量,告诉它它是什么类的实例。由于 Class 类型本身定义为指针:

typedef struct objc_class *Class;

isa变量通常被称为“isa 指针”。</p>

于 2012-09-28T11:26:18.777 回答