在 Objective-C 中,id
是否与 C 中的 void *
完全相同? (通用指针类型)。
如果是这样,当我们使用
id obj = [[Fraction alloc] init];
[obj methodName];
obj = [[ComplexNumber alloc] init];
[obj anotherMethodName];
调用方法时,程序通过什么方式知道obj
是什么类?
最佳答案
id
与 void *
不同。 id
是指向未知类型的 Objective C 对象的指针;就像 C# 或 Java 的 object
数据类型。 void*
可以指向任何东西;非零 id
应指向所有 ObjC 对象共有的数据结构,并包含指向其各自类数据的指针。
ObjC 运行时 - alloc
/init
/etc 的实现。 - 确保所有有效对象中都有正确的类指针。
IIRC,在 Apple 的实现中,id
指向 的指针大小的变量是,实际上是指向类的指针。
在类的数据 block 中,有一个方法列表,将方法签名映射到指向方法实现的函数指针。从那里开始,这是一个相当简单的查找,当您向对象发送消息(即调用方法)时,它会在运行时发生。也是一个指向基类的指针,以便方法查找可以在继承树中继续向上。
顺便说一句,这就是为什么取消引用 void 指针是编译器错误,而向 id
发送消息是合法的,如果静态不安全的话。
关于objective-c - 在 Objective-C 中, "id"是否与 C 中的 "void *"相同,程序在方法调用期间如何告诉类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10273785/