Как определить, хочет ли @selector параметр? - PullRequest
4 голосов
/ 23 января 2011

Сценарий представляет себя там, где у меня есть объект, который хранит внешний @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 Ответ

9 голосов
/ 23 января 2011

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

...