Как упоминалось в kubi, respondsToSelector
обычно используется, когда у вас есть экземпляр метода, который соответствует протоколу.
// Extend from the NSObject protocol so it is safe to call `respondsToSelector`
@protocol MyProtocol <NSObject>
// @required by default
- (void) requiredMethod;
@optional
- (void)optionalMethod;
@end
Учитывая и экземпляр этого протокола, мы можем безопасно вызывать любой требуемый метод.
id <MyProtocol> myObject = ...
[myObject requiredMethod];
Однако необязательные методы могут быть или не быть реализованы, поэтому вам нужно проверить во время выполнения,
if ([myObject respondsToSelector:@selector(optionalMethod)])
{
[myObject optionalMethod];
}
Это предотвратит сбой с помощью нераспознанного селектора.
Кроме того, причина, по которой вы должны объявлять протоколы как расширение объектов NSObject, т.е.*
Это связано с тем, что протокол NSObject объявляет селектор respondsToSelector:
.В противном случае XCode подумает, что это небезопасно.