Objective-C中的instancesRespondToSelector和respondsToSelector有什么区别?

Mat*_*ros 14 objective-c

我自己观察到的唯一区别是respondsToSelector接收器可以是类或实例,而instancesRespondToSelector只能有类接收器.还有什么能让他们与众不同?一个或另一个是否存在任何性能问题?

rob*_*off 25

在引擎盖下,-[NSObject respondsToSelector:]实现如下:

- (BOOL)respondsToSelector:(SEL)aSelector {
    return class_respondsToSelector([self class], aSelector);
}
Run Code Online (Sandbox Code Playgroud)

+[Class instancesRespondToSelector:]实现如下:

+ (BOOL)instancesRespondToSelector:(SEL)aSelector {
    return class_respondsToSelector(self, aSelector);
}
Run Code Online (Sandbox Code Playgroud)

(我在CoreFoundation上使用了Hopper来解决这个问题.)

所以,基本上没有区别.但是,您可以respondsToSelector:在自己的类中重写以在每个实例的基础上返回YES或NO(NSProxy这样做).你不能这样做instancesRespondToSelector:.

  • 小记,`instancesRespondToSelector:`**可以**(和**必须**,如果你实现了消息转发机制)是覆盖.请参阅[Objective-C运行时编程指南,转发和继承部分](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html) (2认同)

wat*_*n12 9

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