关于Apple的obj-c编程指南中“id”的混淆

时间:2012-06-06 08:04:59

标签: objective-c ios

ID 在Objective-C中,对象标识符具有不同的数据类型:id。这种类型是任何类型对象的通用类型,不管是什么类,都可以用于类的实例和类对象本身。

id anObject;

直到这里简单明了


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

没有理解它关于id取代int的内容是什么?并在最后的内部括号int仍然是默认值?


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

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

typedef struct objc_object {
    Class isa;
} *id;

以上不是obj-c语法是什么,它解释什么?


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

typedef struct objc_class *Class;

isa变量通常被称为“isa指针”。

也没有理解这最后一段。

2 个答案:

答案 0 :(得分:2)

  

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

你的书在这里有点令人困惑。它所说的是,如果你正在处理对象并且你不想更具体,那么id是一种很好的数据类型。

  

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

typedef struct objc_object {
    Class isa;
} *id;
  

以上不是obj-c语法是什么,它解释什么?

这是对象的内部表示。你的书试图证明一个客观的C对象不是魔术:在表面下它只是一个结构。数据类型id是指向这种结构的指针。

  

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

     

typedef struct objc_class *Class;

     

isa变量通常被称为“isa指针”。

在其内部数据结构中,每个对象都有一个指向另一个表示其类的对象的指针。

如果您只对Objective-C中的编程感兴趣(至少在您学习的时候没有),您不需要知道这些内容。如果你正在做一些高级的东西,比如当你直接与Objective-C运行时交互时,它确实派上用场。

答案 1 :(得分:1)

  

不明白它的id是什么替换了int?

Objective-C是C的超集。

在C中,函数必须具有返回值。如果未指定返回值,则默认情况下函数返回int

Objective-C会覆盖C的此默认行为,并从未指定其返回值的任何类方法返回id作为默认值。但同时保留其他(C-)函数的默认行为相同(即int仍然是其他所有函数的默认返回值)