感谢您查看我的问题。
我一直在试图环顾四周,我一直在玩低级别的IVars来获取课程中的信息。我在尝试加载来自CGPoint的值时遇到了麻烦。
CGPoint point;
object_getInstanceVariable(obj, [columnName UTF8String], (void **)&point);
NSLog(@"%@", NSStringFromCGPoint(point));
此输出应为 {220,180}
我实际上正在 {220,1.72469e-38}
有人可以帮我解释为什么会这样吗?
答案 0 :(得分:1)
这里真正的问题是CGPoint不是一个对象 - 它是一个普通的C结构。 : - )
答案 1 :(得分:0)
指针在这里混淆了。 point
是一个实例,因此&point
是一个指针(void *
- 就像),而不是指向指针的指针(void **
- 就像)。你需要这样的东西:
CGPoint *point;
object_getInstanceVariable(obj, [columnName UTF8String], (void **)&point);
NSLog(@"%@", NSStringFromCGPoint(*point));
答案 2 :(得分:0)
object_getInstanceVariable()
仅在ivar偏移的开头复制指针数据。毕竟,这就是你给它的所有存储,最后的void **
参数。当你知道你有超过一个指针值的数据时,就像在这种情况下,你可以使用ivar_getOffset()
来查找数据的开始位置,然后根据需要复制出多少字节:
Ivar iv = object_getInstanceVariable(obj, [columnName UTF8String], NULL);
ptrdiff_t offset = ivar_getOffset(iv);
CGPoint point = *(CGPoint *)((char *)obj + offset);
在这种情况下,取消引用CGPoint *
会导致从引用的地址复制sizeof(CGPoint)
个字节;在一般情况下,您可以将memcopy()
或bcopy()
数据从计算出的地址转换为适当大小的缓冲区。
下一个问题是在运行时计算正确的大小......