Есть ли способ проверить, существует ли метод в Objective-C?
Я пытаюсь добавить защитника, чтобы увидеть, есть ли у моего объекта метод до его вызова.
Есть ли способ проверить, существует ли метод в Objective-C?
Я пытаюсь добавить защитника, чтобы увидеть, есть ли у моего объекта метод до его вызова.
if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
[obj methodName:123 withEtc:456];
}
Существует также статическое сообщение instanceRespondToSelector: (SEL) селектор Вы бы назвали это следующим образом:
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
или вот так:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Это может быть полезно, если вы хотите вызвать один конструктор или другой в зависимости от этого (я имею в виду, прежде чем сам экземпляр).
Используйте respondsToSelector:
. Из documentation:
respondsToSelector:
Возвращает логическое значение, указывающее, реализует ли приемник или наследует метод, который может отвечать на указанное сообщение.
- (BOOL)respondsToSelector:(SEL)aSelector
Параметры
aSelector - Селектор, который идентифицирует сообщение.Возвращаемое значение
YES
, если приемник реализует или наследует метод, который может отвечать на aSelector, иначеNO
.
Вы ищете отвечаетSoSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
Как Дональд говорит, выше сказано, что foo может определенно справиться с приемом селектора штрихов. Тем не менее, если foo прокси-сервер, который перенаправляет байт на какой-либо базовый объект, который получит сообщение в панели, затем отвечаетToSelector: будет сообщать вам НЕТ, даже если сообщение будет перенаправлено на объект, который отвечает на бар.
Проверка селекторов с ответамиToSelector обычно используется только для методов делегата. Вы не должны использовать forwardInvocation или прокси для методов делегата. Если вам нужно использовать responsesToSelector в других ситуациях, вы можете захотеть убедиться, что нет более подходящего способа разработки вашей программы.