我对Objective-C id
类型的理解是它是一个指向未知类型对象的指针。在我看来,对于Objective-C类来说,它就像一个void *,在类型检查之类的东西上有一些编译器糖。我的问题是,为什么它不是id*
而不是id
,因为它是指针类型?如果这是Java或C#,其中对象引用未使用*
声明,那么我不会感到惊讶。但是在Objective-C中,每个类都被C风格的指针引用,那么为什么要隐藏*
的未知对象类型呢?
答案 0 :(得分:11)
id typedef
已经是指针:
typedef struct objc_object {
Class isa;
} *id;
来自Objective-C Programming Language:
在Objective-C中,对象标识符具有不同的数据类型:
id
。 此类型是任何类型对象的通用类型,无论如何 class,可用于类的实例和类对象 自己。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指针”。