Как определить, хочет ли @selector параметр?
Сценарий представляет себя там, где у меня есть объект, который хранит внешний @selector для дальнейшего использования. Я хотел бы добавить два вида селекторов. Простой, без параметров, как [object add:@selector(doSomething)]
и более сложный, с одним параметром, как [object add:@selector(doSomething:)]
(обратите внимание на двоеточие). Допустим, селектор хранится в переменной SEL mySelector
,
В исполнении мне нужно определиться между [anotherObject performSelector:mySelector]
или же [anotherObject performSelector:mySelector withObject:userInfo]]
,
Я реализовал это решение, предоставив флаг BOOL, который избыточно хранит, должна ли производительность быть с дополнительным параметром или без него. Тем не менее, хотя я не могу найти это в документации, у меня есть ощущение, что я также должен быть в состоянии спросить селектора что-то вроде -(BOOL)needsParameter
, Я знаю, например, что addTarget:action: в UIGestureRecognizer каким-то образом делает это различие автоматически.
Может ли кто-нибудь указать мне правильное направление?
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
и подсчитать количество вхождений символа двоеточия.