触发方法调用的消息的描述

时间:2013-01-20 03:46:26

标签: objective-c-runtime

objective-c运行时是否允许从该方法本身获取触发方法调用的消息的描述?

例如,如果我有一个名为的方法: - (Foobar)doMyStuff; 。 。是否可以从该方法中得到类似的东西:

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

2 个答案:

答案 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开始。