Проверьте, существует ли метод

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

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

Ответ 1

if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
   [obj methodName:123 withEtc:456];
}

Ответ 2

Существует также статическое сообщение instanceRespondToSelector: (SEL) селектор Вы бы назвали это следующим образом:

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

или вот так:

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

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

Ответ 3

Используйте respondsToSelector:. Из documentation:

respondsToSelector:

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

- (BOOL)respondsToSelector:(SEL)aSelector

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

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

Ответ 4

Вы ищете отвечаетSoSelector: -

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

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

Ответ 5

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