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

前端之家收集整理的这篇文章主要介绍了objective-c – 在Objective C中,“id”与C中的“void *”相同,以及程序在方法调用期间如何告诉类?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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的对象数据类型.空洞*可以指向任何东西;非nil id应指向所有ObjC对象共有的数据结构,并包含指向其各自类数据的指针.

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

IIRC,在Apple的实现中,id指向的指针大小的变量实际上是指向类的指针.

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

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

猜你在找的C&C++相关文章