运行时方法获取参数变量的名称?

时间:2013-12-05 23:49:12

标签: objective-c

在Objective-C方法中,可以使用关键字_cmd获取方法的选择器。对于参数的名称是否存在这样的事情?

例如,如果我有一个声明的方法:

- (void)methodWithAnArgument:(id)foo {
  ...
}

是否有某种构造允许我访问某种类似字符串的变量名表示?也就是说,不是foo的,而是在方法内的局部变量中实际反映变量名“foo”的东西。

此信息似乎不存储在NSInvocation或其任何相关类(NSMethodSignature等)中,所以我不乐观这可以使用Apple的框架或运行时来完成。我怀疑它可能有某种编译时宏,但我不熟悉C宏,所以我不知道从哪里开始。


编辑以包含有关我实际尝试的更多信息。

我正在构建一个工具,以帮助您更轻松地使用第三方URL方案。我希望我的API看起来有两个方面:

作为URL方案的使用者,我可以调用类似[twitterHandler showUserWithScreenName:@"someTwitterHandle"];

的方法

作为具有网址方案的应用的创建者,我可以在plist字典中定义我的网址,其键值对看起来像@"showUserWithScreenName": @"twitter://user?screenName={screenName}"

我现在正在努力寻找将这些粘合在一起的最佳方法。 showUserWithScreenName:当前功能齐全的实现看起来像这样:

- (void)showUserWithScreenName:(NSString *)screenName {
    [self performCommand:NSStringFromSelector(_cmd) withArguments:@{@"screenName": screenName}];
}

其中performCommand:withArguments:是一种方法(除了其他一些逻辑)在plist中查找命令键(在本例中为“showUserWithScreenName:”)并使用传递的字典作为值将值作为模板进行评估绑定。

我正在尝试解决的问题:有许多这样的方法看起来完全相同,但只是换掉字典定义以包含正确的模板参数。在每种情况下,所需的字典键是参数的名称。我正试图找到一种方法来最小化我的样板。

在实践中,我认为我会接受需要一些样板,但我可能会因为NSDictionaryOfVariableBindings而使它变得更加清洁(感谢@CodaFi - 我不是熟悉那个宏!)。为了论证,我很好奇是否有可能使用像forwardInvocation:这样的东西完全元编程,据我所知,这需要一些方法来访问参数名称。

1 个答案:

答案 0 :(得分:0)

componentsSeparatedByString:获取字符串后,可以将:NSStringFromSelector(_cmd)一起使用,并使用@selector的参数名称将参数放入正确的顺序。

您还可以查看此post,它描述了Objective C中的方法命名约定