Objective-Cランタイムでは、メソッドの呼び出しをトリガーしたメッセージの説明を、そのメソッド自体から取得できますか?
たとえば、次のメソッドがある場合:-(Foobar)doMyStuff; 。。そのメソッド内から次のようなものを取得することは可能ですか?
//This would return @"doMyStuff"
NSString* selectorName = [foobar nameOfMessageThatTriggeredMyInvocation];
Objective-Cランタイムでは、メソッドの呼び出しをトリガーしたメッセージの説明を、そのメソッド自体から取得できますか?
たとえば、次のメソッドがある場合:-(Foobar)doMyStuff; 。。そのメソッド内から次のようなものを取得することは可能ですか?
//This would return @"doMyStuff"
NSString* selectorName = [foobar nameOfMessageThatTriggeredMyInvocation];
ジョシュの答えは完全に正しいです。これはロギングに役立つことも付け加えておきます。
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 を使用しても動的なメソッド解決を行う場合は非常に役立ちます。
はい。すべてのメソッドには、隠し引数として渡されるセレクターがあります。の後の 2 番目の引数であり、次のself
ように名前が付けられ_cmd
ます。
NSString * selectorName = NSStringFromSelector(_cmd);
がそのobjc_msgSend(id self, SEL _cmd, ...)
ように見えるのはそのためです。また、 を構築する場合NSInvocation
、引数を設定するときにインデックス 2 から開始するのもそのためです。