【问题标题】:How to determine whether a @selector wants a parameter?如何确定@selector 是否需要参数?
【发布时间】:2011-01-23 13:05:35
【问题描述】:

场景出现在我有一个对象存储外部@selector 以供以后使用的地方。按照设计,我希望能够添加两种选择器。简单的一种,没有参数,如[object add:@selector(doSomething)],更复杂的一种,有一个参数,如[object add:@selector(doSomething:)](注意冒号)。假设选择器存储在变量SEL mySelector 中。

在执行过程中,我需要在[anotherObject performSelector:mySelector][anotherObject performSelector:mySelector withObject:userInfo]] 之间做出选择。

我实现此决定的方式是提供一个 BOOL 标志,该标志冗余地存储性能是否应该带有或不带有额外参数。然而,虽然我在文档中找不到这个,但我觉得我也应该能够向选择器询问类似 -(BOOL)needsParameter 的问题。例如,我知道 UIGestureRecognizer 的 addTarget:action: 以某种方式自动进行了这种区分。

有人能指出我正确的方向吗?

【问题讨论】:

标签: objective-c selector introspection


【解决方案1】:

您可以为此使用NSMethodSignature 类。例如,

SEL mySelector = …;

NSMethodSignature *msig = [anotherObject methodSignatureForSelector:mySelector];
if (msig != nil) {
    NSUInteger nargs = [msig numberOfArguments];
    if (nargs == 2) { // 0 non-hidden arguments
    }
    else if (nargs == 3) { // 1 non-hidden argument
    }
    else {
    }
}

或者,您可以使用NSStringFromSelector() 获取mySelector 的字符串表示形式并计算冒号字符的出现次数。

【讨论】:

  • 完美! NSMethodSignature 确实是我需要的,并且您提供的示例几乎可以立即使用。 NSMethodSignature 将至少有两个参数,因为 self@selector 占用参数 0 和 1。将示例更改为 if (nargs == 2) { ... } else if (nargs == 3) { ... } else { ... } 并且它可以工作。谢谢!
  • 别担心,你帮了我很大的忙!有时我希望自己能从文档中提取这类东西,但我想这是经验带来的东西......
猜你喜欢
  • 1970-01-01
  • 2013-09-11
  • 2016-08-10
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多