在这个场景中,我有一个对象,它存储了一个outside@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:不知怎么的,它会自动进行这种区分。
有人能告诉我正确的方向吗?

最佳答案

您可以使用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的字符串表示形式,并计算冒号字符的出现次数。

10-03 00:24