微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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指针是编译器错误的原因是合法的.

原文地址:https://www.jb51.cc/c/111392.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐