【问题标题】:Get Ivar value from CGPointin Objective-C从 CGPointin Objective-C 获取 Ivar 值
【发布时间】:2010-05-31 14:16:35
【问题描述】:

感谢您查看我的问题。

我一直在尝试环顾四周,并且一直在玩低级别的 Ivar 以从课程中获取信息。我在尝试加载来自 CGPoint 的值时遇到问题。

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

这个的输出应该是{220,180}

我实际上得到了 {220, 1.72469e-38}

谁能帮我解释一下为什么会发生这种情况?

【问题讨论】:

    标签: iphone objective-c memory runtime


    【解决方案1】:

    这里真正的问题是 CGPoint 不是一个对象——它是一个普通的老式 C 结构。 :-)

    【讨论】:

      【解决方案2】:

      指针在这里混淆了。 point 是一个实例,所以&point 是一个指针(void *-like),而不是指向指针的指针(void **-like)。你需要这样的东西:

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

      【讨论】:

      • CGPoint *point; object_getInstanceVariable(self, [@"annotationLocation" UTF8String],(void **) &point); NSLog(@"%@", NSStringFromCGPoint(*point));不错的尝试:) 这给了我 exc_bad_access
      • 您确定 annotationLocation 是一个 CGPoint 字段吗?另外,不要做[@"annotationLocation" UTF8String],只做没有"@"的"annotationLocation"
      • 实际上还有更多问题,在这里阅读更好的解决方案:stackoverflow.com/questions/1219081/…
      • 谢谢....我看了看,只是测试了它,但想知道 obj 参数是从哪里来的?你能告诉我吗?谢谢
      【解决方案3】:

      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() 数据放入适当大小的缓冲区中。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多