Как определить, хочет ли @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 и подсчитать количество вхождений символа двоеточия.

Другие вопросы по тегам