2012-01-28 4 views
7

私が理解する限り、Objective CはC#やJavaよりはるかに動的な言語です。 C#では、呼び出し元オブジェクトのクラスは(stacktraceを使用して)認識できますが、呼び出し側のインスタンス参照は認識できません。Objective Cは実行時(リフレクション)で呼び出し元オブジェクト参照を決定できますか?

Objective Cはこれに対応していますか?

更新:私はここに他の投稿を見たHow can I determine the "caller" of my method in Objective-C?。私が理解する限り、それはクラス名を与えるだけです。私はクラス名だけではなく、呼び出し元自身を参照することで興味を持っていると主張します。

+0

のではなく、あなたが欲しいものを改めて、それはあなたがやろうとしているが何であるかを説明してください。 calleeインスタンスを取得することは、おそらくObjective-Cでは不可能ですが、より高いレベルの問題は別の方法で解決できる可能性があります。 –

答えて

6

これはすでにここに回答されています

How can I determine the "caller" of my method in Objective-C?

答えはしかし、特にきれいではありません。 OSのバージョンやプラットフォームに依存する可能性のある、スタックを捜す以外に単純で信頼性の高い方法はないようです。

なぜこれをしたいのですか?おそらくあなたの問題に対するもう一つの解決策があります。

+0

私はもう1つの投稿を見ました。私が理解する限り、それはクラス名を与えるだけです。私はクラス名だけではなく、インスタンス自体に興味があります。 – user310291

+0

それはおそらく不可能です。他の人が言っているように、Objective-Cメッセージ送信システムは呼び出し元ではなく、呼び出し先とセレクタパラメータを取るobjc_msgSend()関数を中心にしています。 –

5

私が知っている限り、あなたは呼び出し元のクラスさえ取得できません。 Objective-Cのすべてのメソッド呼び出しは、objc_msgSend()によってルーティングされます。受信者、セレクタ、およびメソッドのパラメータがパラメータとして使用されます。

受信者はself、セレクタは_cmdとなります。呼び出し元はメソッド呼び出しに関与しません。メソッドが呼び出された場所を知るためにスタックトレースに戻ることができます。

+0

スタックトレースは、私が読むことができる限りインスタンスのrefではないクラス名を与えるだけですhttp://tombarta.wordpress.com/2008/08/01/c-stack-traces-with-gcc/ – user310291

3

私はこれがスタートかもしれないと思う:NSLog(@"%@", [NSThread callStackSymbols]);

私はあなたが最初にこのスレッドを参照してくださいする必要があると思う、けれども::) NSThread Documentationまた

How to find out who called a method?

+0

これは本当にオブジェクト参照を与えるでしょうかそのクラス名だけでなく、呼び出し元の? – user310291