【问题标题】:Get pointer to class of instance variable in Objective-C在Objective-C中获取指向实例变量类的指针
【发布时间】:2009-08-05 05:04:12
【问题描述】:

我有一个具有多个属性的对象。如果我有一个指向这些属性之一的指针,是否可以获得指向该 ivar 所属的类实例的指针?

例如:foo.bar,哪里知道bar的地址,能找到foo的地址吗?

这似乎与:run time references 相关,但我没有看到任何我正在寻找的参考资料。

感谢您的帮助!

【问题讨论】:

  • 三个答案都很好。谢谢奎因、彼得和约翰。我最终使用了 Peters 解决方案,将一个指向对象实例的指针放在 UIView 的“tag”变量中(我之前提到的 ivar)。

标签: objective-c pointers introspection


【解决方案1】:

首先,您需要稍微调整一下您的术语。不能有指向属性的指针,因为属性是对象的接口,指定 getter 和 setter 方法的格式。

如果您有一个指向 getter 的指针,那么您最多可以返回的方法 (IMP) 将是指向该类的指针,当然您无法返回到实例。

如果你有一个指向 ivar 的指针,我不相信有任何方法可以返回到包含的对象实例。如果您有一个包含所有可能 foo 的数组,则可以向每个人询问一个 ivars 列表,并获取每个 ivar 的地址,并最终以这种方式找到有问题的实例。

最好的解决方案是让 bar 包含对 foo 的父引用,这样 foo.bar.foo 就会给你想要的答案。但这取决于您到底要做什么。很多这些事情的正常 Cocoa 方法也是传递 foo ,就像许多代表所做的那样。例如:

[obj foo:foo doSomethingWithBar:foo.bar];

【讨论】:

    【解决方案2】:

    除非对象有一个指向它的“父”的指针,或者你自己明确地跟踪它,我不相信有办法解决这个问题。你真的必须通过记忆来找到基本上相当于“谁指向我”的东西。这与在单链表中查找前一个节点本质上是相同的问题——你必须从头开始,当你到达指向感兴趣节点的节点时停止。

    试图从地址追踪foobar 的问题在于foo.bar 是一个包含对象地址的指针,只有foo 称它为“bar”。为简单起见,假设foo 位于地址 0x1000,foo.bar 位于 0x1008 并指向位于 0x2000 的另一个对象。现在,如果您的地址为 0x2000,则没有简单的方法可以知道 0x1008 指向它。

    如果你想象N个其他地址也可能指向0x2000,那就更复杂了,所以即使你确实扫描了内存,你也不知道指针属于对象、结构、局部变量,甚至只是与您要查找的地址匹配的随机模式。

    【讨论】:

      【解决方案3】:

      如果你有一个指向实例变量本身的指针,而不是实例变量的内容,你可以这样做。

      Foo * reference = [[Foo alloc] init];
      Foo * foo == [[Foo alloc] init];
      int * barptr = &(foo->bar);
      Foo * baz = (Foo *)((char *)barptr - ((char *)(&(reference->baz)) - (char *)reference));
      

      【讨论】:

        猜你喜欢
        • 2011-07-17
        • 2012-10-15
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多