从CGPointin Objective-C获取Ivar值

时间:2010-05-31 14:16:36

标签: iphone objective-c memory runtime

感谢您查看我的问题。

我一直在试图环顾四周,我一直在玩低级别的IVars来获取课程中的信息。我在尝试加载来自CGPoint的值时遇到了麻烦。

CGPoint point;   
object_getInstanceVariable(obj, [columnName UTF8String], (void **)&point);
NSLog(@"%@", NSStringFromCGPoint(point)); 

此输出应为 {220,180}

我实际上正在 {220,1.72469e-38}

有人可以帮我解释为什么会这样吗?

3 个答案:

答案 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()数据从计算出的地址转换为适当大小的缓冲区。

下一个问题是在运行时计算正确的大小......