0

Objective-Cランタイムでは、メソッドの呼び出しをトリガーしたメッセージの説明を、そのメソッド自体から取得できますか?

たとえば、次のメソッドがある場合:-(Foobar)doMyStuff; 。。そのメソッド内から次のようなものを取得することは可能ですか?

//This would return @"doMyStuff"
NSString* selectorName = [foobar nameOfMessageThatTriggeredMyInvocation]; 
4

2 に答える 2

2

ジョシュの答えは完全に正しいです。これはロギングに役立つことも付け加えておきます。

Class myClass = object_getClass(self);
NSLog(@"I am in %c[%@ %s]", class_isMetaClass(myClass) ? '+' : '-', myClass, sel_getName(_cmd));

「私は -[AppDelegate application:didFinishLaunchingWithOptions:] にいます」

おそらく使いやすいですが-

NSLog(@"So pretty %s", __PRETTY_FUNCTION__);

「とてもきれい -[AppDelegate アプリケーション:didFinishLaunchingWithOptions:]」

これはコンパイル時に挿入され、確かに高速です。_cmd を使用しても動的なメソッド解決を行う場合は非常に役立ちます。

于 2013-02-01T05:17:12.943 に答える
1

はい。すべてのメソッドには、隠し引数として渡されるセレクターがあります。の後の 2 番目の引数であり、次のselfように名前が付けられ_cmdます。

NSString * selectorName = NSStringFromSelector(_cmd);

がそのobjc_msgSend(id self, SEL _cmd, ...)ように見えるのはそのためです。また、 を構築する場合NSInvocation、引数を設定するときにインデックス 2 から開始するのもそのためです。

于 2013-01-20T18:57:39.693 に答える