Как подавить "Класс может не отвечать на предупреждение" -метод "с именем метода переменной? - PullRequest
5 голосов
/ 01 сентября 2011

Как я могу предотвратить это предупреждение с помощью имени селектора переменных?

NSString *methodName;

SEL method = NSSelectorFromString(methodName);

if ([self respondsToSelector:method]) {

    if ([methodName hasSuffix:@":"])
        [self method:dict];
    else
        [self method];

}

Ответы [ 2 ]

9 голосов
/ 01 сентября 2011

Используйте

[self performSelector:method];

Вместо

[self method];

И

[self performSelector:method withObject:dict];

Вместо

[self method:dict];
3 голосов
/ 01 сентября 2011

ответ sidyll работает, но есть лучшее решение.

Как правило, вы объявляете протокол:

 @protocol MyOptionalMethods
 @optional
 - (void)method:(NSDictionary*)dict;
 @end

И объявляете ваш объект соответствующим протоколу:

id<MyOptionalMethods> foo;
UIView*<MyOptionalMethods> bar; // it'll be a subclass o' UIView and may implement pro to

Затем проверьте:

if ([foo respondsToSelector:@selector(method:)])
    [foo method: dict];

Таким образом, у компилятора есть возможность полностью проверить тип всех аргументов.Кроме того, этот шаблон не ограничивается методами, которые не принимают аргументов или один аргумент объекта.

Кроме того, он защищен от перехода на ARC в будущем (поскольку ARC справедливо жалуется на хрупкость executeSelector:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...