В чем разница между экземплярамиRespondToSelector и отвечаетSoSelector в Objective-C?
Единственное различие, которое я наблюдал сам по себе, заключается в том, что приемник respondsToSelector
может быть либо классом, либо экземпляром, тогда как instancesRespondToSelector
может иметь только приемник класса. Что еще отличает их от других? Существуют ли какие-либо проблемы с производительностью с одним или другим?
Ответы
Ответ 1
Под капотом -[NSObject respondsToSelector:]
выполняется следующим образом:
- (BOOL)respondsToSelector:(SEL)aSelector {
return class_respondsToSelector([self class], aSelector);
}
и +[Class instancesRespondToSelector:]
выполняется следующим образом:
+ (BOOL)instancesRespondToSelector:(SEL)aSelector {
return class_respondsToSelector(self, aSelector);
}
(я использовал Hopper на CoreFoundation, чтобы понять это.)
Итак, в принципе нет никакой разницы. Однако вы можете переопределить respondsToSelector:
в своем классе, чтобы вернуть YES или NO для каждого экземпляра (NSProxy
делает это). Вы не можете сделать это с помощью instancesRespondToSelector:
.
Ответ 2
Одно отличие: respondsToSelector
не может сказать вам, если экземпляр наследует метод из своего суперкласса, поэтому, если вы хотите сделать что-то вроде [super respondsToSelector:_cmd];
, он не будет работать, вам нужно [[self superclass] instancesRespondToSelector:_cmd];
Ответ 3
respondsToSelector:
- это метод экземпляра и определяет, отвечает ли объект, который может быть экземпляром класса или объекта класса, селектору. Когда вы передаете экземпляр, который вы тестируете для метода экземпляра, при передаче объекта класса, который вы тестируете для метода класса.
instancesRespondToSelector:
- метод класса и определяет, реагируют ли экземпляры класса на селектор. Он позволяет тестировать метод экземпляра, заданный классом, и без экземпляра этого класса.