3

根据Objective-C 运行时参考

ivar_getOffset 返回实例变量的偏移量。

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

在 runtime.h 中声明

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

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

4

2 回答 2

2

在获取 ivar 的值时,这两种方法没有区别。object_getIvar()您可以通过查看Apple 的开源Obj-C 运行时代码中的实现来验证这一点。

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

将来可能会为这些功能中的任何一个添加更多魔法;通常,您应该在任何给定时间使用可用的最高级别 API。

于 2010-09-25T00:43:15.463 回答
1

也许这object_getIvar并没有什么不同,但是类型id或其他对象类型的实例变量是司空见惯的,调用ivar_getOffset并将结果附加到值object然后强制转换为适当的类型要麻烦得多。

void *请注意,根据 C99 标准(强调我的)中的以下信息,您无法可靠地增加 a 的值:

C99 §6.2.5 (1): (...) 类型分为对象类型(完全描述对象的类型)、函数类型(描述函数的类型)和不完整类型(描述对象但缺少所需信息的类型)确定它们的大小)。

C99 §6.2.5 (19):void类型包含一组空值;它是一个不完整的类型,无法完成。

C99 §6.5.6 (2):对于加法,两个操作数都应具有算术类型,或者一个操作数应是指向对象类型的指针,而另一个应具有整数类型。(递增相当于加 1。)

C99 §6.5.2.1 (1):其中一个表达式应具有“指向对象类型的指针”类型,另一个表达式应具有整数类型,并且结果具有“类型”类型。

要将指针增加任意数字,您可以char *改用。

于 2010-08-26T05:46:32.937 回答