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 应用程序:didFinishLaunchingWithOptions:]”

虽然它可能更容易使用 -

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

“太漂亮了 -[AppDelegate 应用程序:didFinishLaunchingWithOptions:]”

它在编译时被插入,当然更快。如果您执行任何动态方法解析,尽管使用 _cmd 非常有帮助。

于 2013-02-01T05:17:12.943 回答
1

是的。每个方法都有其选择器作为隐藏参数传入。这是第二个参数,在 之后self,它被命名为_cmd

NSString * selectorName = NSStringFromSelector(_cmd);

这就是为什么objc_msgSend(id self, SEL _cmd, ...)看起来它的方式,以及为什么,如果你构造一个NSInvocation,你在设置你的参数时从索引 2 开始。

于 2013-01-20T18:57:39.693 回答