2009-08-05 7 views
2

私はいくつかのプロパティを持つオブジェクトを持っています。これらのプロパティのいずれかへのポインタがあれば、そのivarが属するクラスインスタンスへのポインタを取得できますか?Objective-Cのインスタンス変数のクラスへのポインタを取得

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

これは次のようなものです:run time referencesしかし、私が探していたものはまったく見当たりませんでした。

ありがとうございました!

+0

すべての3つの答えは非常に優れています。クイン、ピーター、ジョンに感謝します。 私は、オブジェクトビューへのポインタをUIViewの "タグ"変数に置くことでピーターズのソリューションを使い終えました(私がこれまで参照していたもの)。 –

答えて

1

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

ゲッターへのポインタがあれば、戻ってくる可能性のあるメソッド(IMP)はクラスへのポインタになりますが、確かにインスタンスに戻ることはできませんでした。

あなたがivarへのポインタを持っていた場合、私は包含するオブジェクトインスタンスに戻る方法がないと思います。すべての可愛いフォースの配列を持っていれば、それぞれにivarsのリストを尋ねることができ、それぞれのivarとeventualltyのアドレスを取得することで、問題のインスタンスをそのように見つけることができます。

最善の解決策は、foo.bar.fooは、あなたが望む答えを与えるように、fooへの親の参照を格納するためのバーです。しかし、それはあなたが何をしようとしているかによって異なります。これらの事の多くのための通常のココアの方法は、多くのデリゲートで行われるように、fooも渡すことです。例:

1

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

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

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

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)); 
関連する問題