我自己观察到的唯一区别是respondsToSelector
接收器可以是类或实例,而instancesRespondToSelector
只能有一个类接收器。但是,还有什么让它们与众不同?两者之间是否存在性能问题?
3 回答
在引擎盖下,-[NSObject respondsToSelector:]
是这样实现的:
- (BOOL)respondsToSelector:(SEL)aSelector {
return class_respondsToSelector([self class], aSelector);
}
并+[Class instancesRespondToSelector:]
像这样实现:
+ (BOOL)instancesRespondToSelector:(SEL)aSelector {
return class_respondsToSelector(self, aSelector);
}
(我在 CoreFoundation 上使用Hopper来解决这个问题。)
所以,基本没有区别。但是,您可以respondsToSelector:
在自己的类中覆盖以在每个实例的基础上返回 YES 或 NO(NSProxy
这样做)。你不能用instancesRespondToSelector:
.
一个区别是respondsToSelector
不能告诉你一个实例是否从它的超类继承了一个方法,所以如果你想做一些[super respondsToSelector:_cmd];
它不起作用的事情,你需要[[self superclass] instancesRespondToSelector:_cmd];
respondsToSelector:
是一个实例方法,它确定一个对象(可以是类的实例或类对象)是否响应选择器。当你传递一个实例时,你正在测试一个实例方法,当你传递一个类对象时,你正在测试一个类方法。
instancesRespondToSelector:
是一个类方法,并确定类的实例是否响应选择器。它允许测试给定类的实例方法,而无需该类的实例。