Ответы:
Также существует селектор static message instanceRespondToSelector: (SEL) Вы бы назвали его так:
[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]
или вот так:
[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]
Это может быть полезно, если вы хотите вызвать один конструктор или другой в зависимости от этого (я имею в виду, прежде чем иметь сам экземпляр).
Используйте respondsToSelector:
. Из документации :
RespondsToSelector:
Возвращает логическое значение, которое указывает, реализует ли получатель или наследует метод, который может отвечать на указанное сообщение.
- (BOOL)respondsToSelector:(SEL)aSelector
Параметры
aSelector - селектор, который идентифицирует сообщение.Возвращаемое значение,
YES
если получатель реализует или наследует метод, который может отвечать на aSelector , в противном случаеNO
.
Вы ищете RespondsToSelector: -
if ([foo respondsToSelector: @selector(bar)] {
[foo bar];
}
Как сказал Донал, приведенное выше говорит вам, что foo определенно может справиться с получением селектора bar. Однако, если foo является прокси-сервером, который перенаправляет bar на некоторый базовый объект, который получит сообщение bar, то responsedsToSelector: скажет вам НЕТ, даже если сообщение будет перенаправлено объекту, который отвечает на bar.
Проверка селекторов с помощью responsedsToSelector обычно выполняется только для методов делегата. Вы не должны использовать forwardInvocation или прокси для методов делегата. Если вам нужно использовать RespondsToSelector в других ситуациях, вы можете убедиться, что нет более подходящего способа разработки вашей программы.
- forwardInvocation:
).