16

我自己观察到的唯一区别是respondsToSelector接收器可以是类或实例,而instancesRespondToSelector只能有一个类接收器。但是,还有什么让它们与众不同?两者之间是否存在性能问题?

4

3 回答 3

26

在引擎盖下,-[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:.

于 2012-07-20T07:53:39.293 回答
9

一个区别是respondsToSelector不能告诉你一个实例是否从它的超类继承了一个方法,所以如果你想做一些[super respondsToSelector:_cmd];它不起作用的事情,你需要[[self superclass] instancesRespondToSelector:_cmd];

于 2012-07-20T07:23:53.750 回答
4

respondsToSelector:是一个实例方法,它确定一个对象(可以是类的实例类对象)是否响应选择器。当你传递一个实例时,你正在测试一个实例方法,当你传递一个类对象时,你正在测试一个类方法。

instancesRespondToSelector:是一个方法,并确定类的实例是否响应选择器。它允许测试给定类的实例方法,而无需该类的实例。

于 2012-07-20T07:54:12.810 回答