在Objective C中,"id"与C中的"void*"相同,以及程序在方法调用期间如何告诉类?

nop*_*ole 6 objective-c

在Objective C中,idvoid *C 完全相同?(通用指针类型).

如果是这样,我们使用的时候

id obj = [[Fraction alloc] init];
[obj methodName];
obj = [[ComplexNumber alloc] init];
[obj anotherMethodName];
Run Code Online (Sandbox Code Playgroud)

当调用该方法时,程序以什么方式知道哪个类obj是什么?

Sev*_*yev 5

id是不一样的void *.id是指向未知类型的Objective C对象的指针; 喜欢objectC#或Java 的数据类型.A void*可以指出任何事情; 一个非空id,预计在数据结构,这是通用于所有ObjC对象和包含一个指向各自的类数据点.

ObjC运行时 - alloc/ init/ etc 的实现. - 确保所有有效对象都包含正确的类指针.

IIRC,在苹果的实施指针大小的变量id指向的就是,其实指针类.

在类的数据块中,有一个方法列表将方法签名映射到方法实现的函数指针.从那里开始,当您向对象发送消息(即调用方法)时,这是一个相当简单的查找.也是指向基类的指针,以便方法查找可以继续继承树.

顺便说一下,这就是为什么在向id静态指针发送消息时,如果静态不安全,则将消息指针解析为编译器错误的原因是合法的.


Onl*_*You 5

idObjective-C中的内容与C中的内容完全不同void *.

来自Apple的"Objective-C编程语言":

typedef struct objc_object {
   Class isa;
} *id;
Run Code Online (Sandbox Code Playgroud)

这意味着,id是一个指向objc_object结构的指针,它与指向的结构不同void.

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

typedef struct objc_class *Class;
Run Code Online (Sandbox Code Playgroud)

关于,程序如何在方法调用期间告诉类?,这是来自上面引用的相同编程指南:

isa实例变量标识对象的 -什么样的对象是的.具有相同行为(方法)和相同类型的数据(实例变量)的对象是同一类的成员.

因此,对象在运行时动态输入.只要需要,运行时系统就可以通过询问对象来找到对象所属的确切类.(要了解有关运行时的更多信息,请参阅 Objective-C运行时编程指南.)

根据引导,id,nil,和其他基本类型的Objective-C的都在头文件中定义objc/objc.h.