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 应用程序:didFinishLaunchingWithOptions:]”
虽然它可能更容易使用 -
NSLog(@"So pretty %s", __PRETTY_FUNCTION__);
“太漂亮了 -[AppDelegate 应用程序:didFinishLaunchingWithOptions:]”
它在编译时被插入,当然更快。如果您执行任何动态方法解析,尽管使用 _cmd 非常有帮助。
是的。每个方法都有其选择器作为隐藏参数传入。这是第二个参数,在 之后self
,它被命名为_cmd
:
NSString * selectorName = NSStringFromSelector(_cmd);
这就是为什么objc_msgSend(id self, SEL _cmd, ...)
看起来它的方式,以及为什么,如果你构造一个NSInvocation
,你在设置你的参数时从索引 2 开始。