为什么Objective-C中的id类型会省略星号?

为什么Objective-C中的id类型会省略星号?,objective-c,Objective C,我对Objective-Cid类型的理解是,它是指向未知类型对象的指针。在我看来,对于Objective-C类来说,这就像一个空白,上面有一些编译器糖,用于类型检查之类的东西。我的问题是,既然它是指针类型,为什么它不是id*而不是id?如果这是Java或C#,其中对象引用不是使用*声明的,那么我就不会感到惊讶了。但是在Objective-C中,每个类都由C样式的指针引用,那么为什么要隐藏未知对象类型的*?id typedef已经是一个指针: typedef struct objc_object

我对Objective-C
id
类型的理解是,它是指向未知类型对象的指针。在我看来,对于Objective-C类来说,这就像一个空白,上面有一些编译器糖,用于类型检查之类的东西。我的问题是,既然它是指针类型,为什么它不是
id*
而不是
id
?如果这是Java或C#,其中对象引用不是使用
*
声明的,那么我就不会感到惊讶了。但是在Objective-C中,每个类都由C样式的指针引用,那么为什么要隐藏未知对象类型的
*

id typedef已经是一个指针:

typedef struct objc_object {
    Class isa;
} *id;
typedef struct objc_class *Class;
从:

在Objective-C中,对象标识符具有不同的数据类型:
id
。 此类型是任何类型对象的常规类型,而不考虑 类,并可用于类的实例和类对象 他们自己

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

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

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

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

typedef struct objc_object {
    Class isa;
} *id;
typedef struct objc_class *Class;
isa
变量经常 称为“isa指针”


类中也没有星号。