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

时间:2012-09-28 11:22:09

标签: objective-c

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

1 个答案:

答案 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指针”。