objective-c运行时是否允许从该方法本身获取触发方法调用的消息的描述?
例如,如果我有一个名为的方法: - (Foobar)doMyStuff; 。 。是否可以从该方法中得到类似的东西:
//This would return @"doMyStuff"
NSString* selectorName = [foobar nameOfMessageThatTriggeredMyInvocation];
答案 0 :(得分:2)
Josh的回答是完全正确的,我还可以补充一点,这对于记录非常有用。
Class myClass = object_getClass(self);
NSLog(@"I am in %c[%@ %s]", class_isMetaClass(myClass) ? '+' : '-', myClass, sel_getName(_cmd));
“我在 - [AppDelegate应用程序:didFinishLaunchingWithOptions:]”
虽然它可能更容易使用 -
NSLog(@"So pretty %s", __PRETTY_FUNCTION__);
“非常漂亮 - [AppDelegate应用程序:didFinishLaunchingWithOptions:]”
在编译时插入,并且肯定更快。如果使用_cmd进行任何动态方法解析,则非常有帮助。
答案 1 :(得分:1)
是。每个方法都将其选择器作为隐藏参数传入。这是self
之后的第二个参数,它被命名为_cmd
:
NSString * selectorName = NSStringFromSelector(_cmd);
这就是为什么objc_msgSend(id self, SEL _cmd, ...)
看起来如此,以及为什么,如果你构造一个NSInvocation
,你在设置你的参数时从索引2开始。