获取Objective-C中实例变量类的指针

时间:2009-08-05 05:04:12

标签: objective-c pointers introspection

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

例如:foo.bar,我知道bar的地址,可以找到foo的地址吗?

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

如果你有一个指向getter的指针,一个方法(IMP)最多你可以回来就是指向类的指针,当然你无法回到实例。

如果你有一个指向ivar的指针,我不相信有任何办法可以回到包含对象实例。如果你有一个所有可能的foos阵列,也许可以向他们每个人询问一个ivars列表,并获得每个ivar的地址,并且eventuallty以这种方式找到有问题的实例。

最好的解决方案是让bar包含对foo的父引用,以便foo.bar.foo为您提供所需的答案。但这取决于你究竟想要做什么。很多这些东西的正常Cocoa方式也是传递foo,就像许多代表所做的那样。例如:

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

答案 2 :(得分:0)

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

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