在Objective C中,id与C中的void *完全相同吗? (通用指针类型).
如果是这样,我们使用的时候
id obj = [[Fraction alloc] init]; [obj methodName]; obj = [[ComplexNumber alloc] init]; [obj anotherMethodName];
解决方法
id与void *不同. id是指向未知类型的Objective C对象的指针;喜欢C#或Java的对象数据类型.空洞*可以指向任何东西;非nil id应指向所有ObjC对象共有的数据结构,并包含指向其各自类数据的指针.
ObjC运行时 – alloc / init / etc的实现. – 确保所有有效对象都包含正确的类指针.
IIRC,在Apple的实现中,id指向的指针大小的变量实际上是指向类的指针.
在类的数据块中,有一个方法列表将方法签名映射到方法实现的函数指针.从那里开始,当您向对象发送消息(即调用方法)时,这是一个相当简单的查找.也是指向基类的指针,以便方法查找可以继续继承树.
顺便说一句,这就是为什么在向id发送消息时,如果静态不安全的话,derefencing void指针是编译器错误的原因是合法的.