Проверьте, существует ли метод - PullRequest
106 голосов
/ 29 апреля 2010

Есть ли способ проверить, существует ли метод в Objective-C?

Я пытаюсь добавить охрану, чтобы проверить, есть ли у моего объекта метод перед его вызовом.

Ответы [ 5 ]

185 голосов
/ 29 апреля 2010
if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
   [obj methodName:123 withEtc:456];
}
71 голосов
/ 24 мая 2012

Есть также статическое сообщение instancesRespondToSelector: (SEL) селектор Вы бы назвали это так:

[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]

или как это:

[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]

Это может быть полезно, если вы хотите вызвать тот или иной конструктор, в зависимости от этого (я имею в виду, прежде чем иметь сам экземпляр).

12 голосов
/ 29 апреля 2010

Используйте respondsToSelector:. Из документации :

respondsToSelector:

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

- (BOOL)respondsToSelector:(SEL)aSelector

Параметры
aSelector - Селектор, который идентифицирует сообщение.

Возвращаемое значение
YES если получатель реализует или наследует метод, который может ответить на aSelector , в противном случае NO.

9 голосов
/ 29 апреля 2010

Вы ищете responses toSelector: -

if ([foo respondsToSelector: @selector(bar)] {
  [foo bar];
}

Как Донал говорит , вышесказанное говорит вам, что foo может определенно обрабатывать получение селектора баров. Однако, если foo является прокси-сервером, который перенаправляет панель какому-либо базовому объекту, который получит сообщение панели, тогда RespondsToSelector: сообщит вам НЕТ, даже если сообщение будет перенаправлено объекту, который отвечает на строку.

1 голос
/ 18 января 2011

Проверка селекторов с RespondsToSelector обычно только для методов делегата. Вы не должны использовать forwardInvocation или прокси для методов делегата. Если вам нужно использовать RespondsToSelector в других ситуациях, вы можете убедиться, что нет более подходящего способа разработки вашей программы.

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