加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 在Objective C中,“id”与C中的“void *”相同,

发布时间:2020-12-16 03:27:12 所属栏目:百科 来源:网络整理
导读:在Objective C中,id与C中的void *完全相同吗? (通用指针类型). 如果是这样,我们使用的时候 id obj = [[Fraction alloc] init];[obj methodName];obj = [[ComplexNumber alloc] init];[obj anotherMethodName]; 当调用该方法时,程序以什么方式知道obj是什么
在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指针是编译器错误的原因是合法的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读