首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*(id *)((char *)object + ivar_getOffset( ivar) )和object_getIvar(object,ivar)之间的区别是什么?

*(id *)((char *)object + ivar_getOffset( ivar) )和object_getIvar(object,ivar)之间的区别是什么?
EN

Stack Overflow用户
提问于 2010-08-26 04:33:38
回答 2查看 1.5K关注 0票数 3

根据Objective运行时参考

ivar_getOffset返回实例变量的偏移量。 ptrdiff_t ivar_getOffset( ivar )讨论id类型或其他对象类型的实例变量,调用object_getIvar和object_setIvar,而不是使用此偏移量直接访问实例变量数据。 在运行时声明。

为什么会这样呢?object_getIvar对对象类型做了什么?

编辑:将问题从订阅(void *)更改为(id *)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-25 00:43:15

这两种方法在获取象牙的价值时并没有什么区别。您可以通过查看object_getIvar()在苹果开源Obj运行时代码中的实现来验证这一点。

object_setIvar()所做的不仅仅是分配对象指针的偏移量。调用垃圾收集运行时函数objc_assign_ivar()来执行实际的分配是非常小心的。

将来可能会给这些函数添加更多的魔法;一般来说,您应该在任何给定的时间使用最高级别的API。

票数 2
EN

Stack Overflow用户

发布于 2010-08-26 05:46:32

也许不是object_getIvar做了一些不同的事情,但是id类型或其他对象类型的实例变量很常见,调用ivar_getOffset并将结果附加到object值,然后转换为适当的类型要麻烦得多。

请注意,您不能根据来自void *标准的以下信息可靠地增加C99的值(强调我的信息):

C99第6.2.5(1)条:(.)类型被划分为对象类型(完全描述对象的类型)、函数类型(描述函数的类型)和不完全类型(描述对象但缺乏确定其大小所需的信息的类型)。 C99§6.2.5 (19):void类型包含一组空值;它是不完整类型,无法完成。 C99§6.5.6 (2):另外,两个操作数都应该具有算术类型,或者一个操作数应该是指向对象类型的指针,而另一个操作数应该是整数类型。(增量等于添加1。) C99§6.5.2.1 (1):其中一个表达式应该具有“指向对象类型的指针”类型,另一个表达式应该具有整数类型,而结果应该具有“类型”类型。

若要将指针增量为任意数字,可以使用char *

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3572068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档