1

多くのスクリプト言語には caller() があるので、呼び出し元の情報を ObjC メソッドで取得したいと考えています。特に、コンパイラによって自動的に呼び出される dealloc メソッドで必要なので、引数を渡すことができませんでした。

ObjC の例外にはスタックトレースがあるので、呼び出し元の情報がどこかにあるのでしょう。例外をスローせずに情報を取得するにはどうすればよいですか?

-(void)dealloc {
  // get caller's information and NSLog() it here!
}
4

3 に答える 3

2

backtrace(3)&& backtrace_symbols(3)C関数から必要な情報を取得できます。Objective-Cの場合に見栄えを良くするために、ジゲリーポケリーが必要になる場合があります。

編集:私はそれを取り戻しbacktrace_symbolsます-Objective-Cテストプログラムのためにここに美しい出力を与えました:

0   example           0x0000000109274c77 +[TestClass classMethod] + 55
1   example           0x0000000109274cee -[TestClass instanceMethod] + 46
2   example           0x0000000109274dec main + 140
3   libdyld.dylib     0x00007fff914c37e1 start + 0

0   example           0x0000000109274c77 +[TestClass classMethod] + 55
1   example           0x0000000109274d36 -[TestClass dealloc] + 54
2   example           0x0000000109274e19 main + 185
3   libdyld.dylib     0x00007fff914c37e1 start + 0

backtrace*呼び出しを入れて、からclassMethod呼び出しました。どちらの場合も問題なく動作するようです。instanceMethoddealloc

于 2013-01-17T23:46:48.387 に答える
2

dtrace (http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html にはいくつかの情報があります。「mac dtrace」をグーグルで検索すると、さらに多くの情報が得られます) を使用してアプリをイントロスペクトすることを検討しましたか?内側に物を追加するのではなく、外側に?この方法で大量の情報を取得できます。それでは不十分な場合は、アプリ内にカスタムの静的プローブを追加してさらに収集することもできます。

于 2013-01-18T00:25:22.700 に答える
-2

self と _cmd を使用していますか?

NSLog(@"%@", self);
于 2013-01-18T00:05:01.230 に答える