ivar_getOffset 返回实例变量的偏移量。
ptrdiff_t ivar_getOffset(Ivar ivar) 讨论 对于 id 类型或其他对象类型的实例变量,调用 object_getIvar 和 object_setIvar 而不是使用此偏移量直接访问实例变量数据。
在 runtime.h 中声明
为什么是这样?object_getIvar 对对象类型做了什么?
编辑:将问题从下标(void *)更改为(id *)。
ivar_getOffset 返回实例变量的偏移量。
ptrdiff_t ivar_getOffset(Ivar ivar) 讨论 对于 id 类型或其他对象类型的实例变量,调用 object_getIvar 和 object_setIvar 而不是使用此偏移量直接访问实例变量数据。
在 runtime.h 中声明
为什么是这样?object_getIvar 对对象类型做了什么?
编辑:将问题从下标(void *)更改为(id *)。
在获取 ivar 的值时,这两种方法没有区别。object_getIvar()
您可以通过查看Apple 的开源Obj-C 运行时代码中的实现来验证这一点。
object_setIvar()
不仅仅是分配到对象指针的偏移量。小心调用垃圾收集运行时函数objc_assign_ivar()
来执行实际分配。
将来可能会为这些功能中的任何一个添加更多魔法;通常,您应该在任何给定时间使用可用的最高级别 API。
也许这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 *
改用。