2011-01-23 37 views
4

该场景呈现自己,我有一个对象,存储一个外部@选择器供以后使用。按照设计,我希望能够添加两种选择器。简单的一个,没有参数,比如[object add:@selector(doSomething)],更复杂的是一个参数,比如[object add:@selector(doSomething:)](介意冒号)。假设选择器存储在变量SEL mySelector中。如何确定@ selector是否需要参数?

在执行中,我需要在[anotherObject performSelector:mySelector][anotherObject performSelector:mySelector withObject:userInfo]]之间做出决定。

我执行此决定的方式是通过提供一个BOOL标志来冗余存储性能是否应该带或不带额外参数。然而,虽然我无法在文档中找到它,但我有这样的感觉,我应该也可以询问选择器,如-(BOOL)needsParameter。我知道,例如,UIGestureRecognizer的addTarget:action:以某种方式自动进行这种区分。

难道有人指着我正确的方向吗?

+1

可能的重复http://stackoverflow.com/questions/3571739/how-to-get-the-arity-of-a-method – Yuras 2011-01-23 13:11:08

+0

@Yuras:不错的发现 – BoltClock 2011-01-23 13:13:28

回答

9

您可以使用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串表示和计算冒号的出现的次数。