2

いくつかのプロパティを持つオブジェクトがあります。これらのプロパティの1つへのポインターがある場合、そのivarが属するクラスインスタンスへのポインターを取得することは可能ですか?

例:foo.barは、barのアドレスを知っていますが、fooのアドレスを見つけることができますか?

これは関連しているようです:実行時の参照ですが、私が探しているものとまったく同じ参照は見つかりませんでした。

ご協力いただきありがとうございます!

4

3 に答える 3

1

オブジェクトがその「親」へのポインタを持っているか、自分で明示的に追跡しない限り、それを解決する方法はないと思います。基本的に「誰が私を指しているのか」に相当するものを見つけるために、あなたは本当に記憶をたどる必要があるでしょう。これは、単一リンクリストで前のノードを見つけるのと本質的に同じ問題です。最初から開始し、目的のノードを指すノードに到達したときに停止する必要があります。

fooアドレスからへの追跡を試みる際の問題barfoo.bar、オブジェクトのアドレスを含むポインタであり、fooそれを「バー」と呼ぶだけであるということです。簡単にするために、それfooがアドレス0x1000にありfoo.bar、0x1008にあり、0x2000にある別のオブジェクトを指していると想像してください。さて、あなたがアドレス0x2000を持っているなら、0x1008がそれを指していることを知る簡単な方法はありません。

他のN個のアドレスも0x2000を指している可能性があると想像すると、さらに複雑になります。したがって、メモリをスキャンしたとしても、ポインタがオブジェクト、構造体、ローカル変数に属しているのか、それとも単なるランダムパターンであるのかはわかりません。それはたまたまあなたが探しているアドレスと一致していました。

于 2009-08-05T05:23:17.610 に答える
1

まず、用語を少し調整する必要があります。プロパティはオブジェクトへのインターフェイスであり、getterメソッドとsetterメソッドの形式を指定するため、プロパティへのポインターを持つことはできません。

ゲッターへのポインターがある場合、せいぜい戻すことができるメソッド(IMP)はクラスへのポインターであり、確かにインスタンスに戻ることはできません。

ivarへのポインタがある場合、含まれているオブジェクトインスタンスに戻る方法はないと思います。考えられるすべてのfooの配列がある場合は、それぞれにivarのリストを要求し、各ivarのアドレスを取得して、最終的に問題のインスタンスをそのように見つけることができる場合があります。

最善の解決策は、barにfooへの親参照を含めることです。これにより、foo.bar.fooが必要な答えを提供します。しかし、それはあなたが何をしようとしているのかによります。これらの多くの通常のCocoaの方法は、多くのデリゲートで行われているように、fooも渡すことです。例えば:

[obj foo:foo doSomethingWithBar:foo.bar];
于 2009-08-05T05:35:46.493 に答える
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));
于 2009-08-05T14:58:20.470 に答える