0

クラス A に関数 myFunc() があります。この関数を呼び出す他の複数のクラスがあります。

特定のインスタンスでどのクラスが myFunc() を呼び出しているかを調べるにはどうすればよいですか?

誰かがこれで私を助けることができますか?

4

2 に答える 2

1

概念的には、この情報はスタックで利用できますが、簡単には取得できません。ほとんどのソリューションでは、スタック トレースを取得するために例外を作成してから、トレースを読み取る必要があります。私はこれを試していませんが、うまくいくかもしれません:

void myFunc()
{
    NSArray *stack = [NSThread callStackSymbols];
    // I have no idea if the current function call is at the 0 or last position
    // of the array. Experiment here!
}

関連ドキュメント: NSThread Class Reference

呼び出し元に応じて関数の動作を変えたい場合は、DO NOT DO THISに注意してください。callStackSymbols脆弱です (戻り値の形式が変わるかどうかについての保証はありません)。

単純にパラメータを関数に渡す方がよいでしょう。C 関数のコールバック API を扱っている場合、通常、void *任意のポインターを渡すために使用できる "context" または "info" パラメーターがあります。これは、オブジェクトへのポインターである可能性があります。

于 2012-06-20T20:21:03.517 に答える
1

訪問者パターンを使用する

  1. 呼び出しクラスのそれぞれに、達成しようとしている動作のインターフェイスを定義する共通のプロトコルを実装させます。
  2. プロトコルをパラメーターとして myFunc に追加します。
  3. myFunc() を呼び出すときは、selfをパラメーターとして指定します。
  4. myFunc は、他の特定のクラスを知らなくても、任意のプロトコル メソッドを呼び出すことができるようになりました。

このようにして、カプセル化の概念を順守します。

于 2012-06-20T20:18:47.987 に答える