在这个场景中,我有一个对象,它存储了一个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
的字符串表示形式,并计算冒号字符的出现次数。