Objective c 如何确定@选择器是否需要参数?

Objective c 如何确定@选择器是否需要参数?,objective-c,selector,introspection,Objective C,Selector,Introspection,在这个场景中,我有一个对象,它存储了一个外部@selector,供以后使用。根据设计,我希望能够添加两种选择器。简单的一个没有参数,如[对象添加:@selector(doSomething)],而更复杂的一个只有一个参数,如[对象添加:@selector(doSomething:)](注意冒号)。假设选择器存储在变量SEL mySelector中 在执行过程中,我需要在[另一个对象执行选择器:mySelector]或[另一个对象执行选择器:mySelector with object:userI

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

在执行过程中,我需要在
[另一个对象执行选择器:mySelector]
[另一个对象执行选择器:mySelector with object:userInfo]
之间做出选择

我实现这个决定的方法是提供一个BOOL标志,它冗余地存储性能是否应该有额外的参数。然而,尽管我在文档中找不到这一点,但我觉得我也应该能够向选择器询问一些类似
-(BOOL)needsParameter
的问题。例如,我知道UIGestureRecognitor的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
的字符串表示形式,并计算冒号字符的出现次数。

可能重复的重复次数非常多!我今天还学了一个新单词,它叫“arity”:)谢谢尤拉斯!太好了
NSMethodSignature
确实是我所需要的,您提供的示例几乎可以立即使用
NSMethodSignature
将至少有两个参数,因为
self
@selector
占用参数0和1。将示例更改为
if(nargs==2){…}else if(nargs==3){…}else{…}
,它就可以工作了。谢谢别担心,老兄,你帮了我大忙!有时候我希望自己能从文档中提取这种东西,但我想这是经验带来的。。。