いくつかのプロパティを持つオブジェクトがあります。これらのプロパティの1つへのポインターがある場合、そのivarが属するクラスインスタンスへのポインターを取得することは可能ですか?
例:foo.barは、barのアドレスを知っていますが、fooのアドレスを見つけることができますか?
これは関連しているようです:実行時の参照ですが、私が探しているものとまったく同じ参照は見つかりませんでした。
ご協力いただきありがとうございます!
いくつかのプロパティを持つオブジェクトがあります。これらのプロパティの1つへのポインターがある場合、そのivarが属するクラスインスタンスへのポインターを取得することは可能ですか?
例:foo.barは、barのアドレスを知っていますが、fooのアドレスを見つけることができますか?
これは関連しているようです:実行時の参照ですが、私が探しているものとまったく同じ参照は見つかりませんでした。
ご協力いただきありがとうございます!
オブジェクトがその「親」へのポインタを持っているか、自分で明示的に追跡しない限り、それを解決する方法はないと思います。基本的に「誰が私を指しているのか」に相当するものを見つけるために、あなたは本当に記憶をたどる必要があるでしょう。これは、単一リンクリストで前のノードを見つけるのと本質的に同じ問題です。最初から開始し、目的のノードを指すノードに到達したときに停止する必要があります。
foo
アドレスからへの追跡を試みる際の問題bar
はfoo.bar
、オブジェクトのアドレスを含むポインタであり、foo
それを「バー」と呼ぶだけであるということです。簡単にするために、それfoo
がアドレス0x1000にありfoo.bar
、0x1008にあり、0x2000にある別のオブジェクトを指していると想像してください。さて、あなたがアドレス0x2000を持っているなら、0x1008がそれを指していることを知る簡単な方法はありません。
他のN個のアドレスも0x2000を指している可能性があると想像すると、さらに複雑になります。したがって、メモリをスキャンしたとしても、ポインタがオブジェクト、構造体、ローカル変数に属しているのか、それとも単なるランダムパターンであるのかはわかりません。それはたまたまあなたが探しているアドレスと一致していました。
まず、用語を少し調整する必要があります。プロパティはオブジェクトへのインターフェイスであり、getterメソッドとsetterメソッドの形式を指定するため、プロパティへのポインターを持つことはできません。
ゲッターへのポインターがある場合、せいぜい戻すことができるメソッド(IMP)はクラスへのポインターであり、確かにインスタンスに戻ることはできません。
ivarへのポインタがある場合、含まれているオブジェクトインスタンスに戻る方法はないと思います。考えられるすべてのfooの配列がある場合は、それぞれにivarのリストを要求し、各ivarのアドレスを取得して、最終的に問題のインスタンスをそのように見つけることができる場合があります。
最善の解決策は、barにfooへの親参照を含めることです。これにより、foo.bar.fooが必要な答えを提供します。しかし、それはあなたが何をしようとしているのかによります。これらの多くの通常のCocoaの方法は、多くのデリゲートで行われているように、fooも渡すことです。例えば:
[obj foo:foo doSomethingWithBar:foo.bar];
インスタンス変数の内容ではなく、インスタンス変数自体へのポインタがある場合は、これを行うことができます。
Foo * reference = [[Foo alloc] init];
Foo * foo == [[Foo alloc] init];
int * barptr = &(foo->bar);
Foo * baz = (Foo *)((char *)barptr - ((char *)(&(reference->baz)) - (char *)reference));