相当于-respondsToSelector的类方法:

是否有一个类的方法等价于-respondsToSelector:

+respondsToSelector:

我问的原因是因为通过实现-respondsToSelector:在类级别上,我得到一个编译器警告:“found”-respondsToSelector:“而不是”协议中的“+ respondsToSelector:”。

代码如下所示:

 Class <SomeProtocol> someClass = [someInstance class]; if ([someClass respondsToSelector:@selector(someSelector:)]) { someVar = [someClass someSelector:someData]; } 

看到您的编辑后更新:

一个类对象响应respondsToSelector:就好,你可能知道。 在testing应用程序中,我可以在没有任何编译器警告的情况下执行以下两个操作:

 NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]); NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]); 

但是,你已经在你的variables上声明了一个协议,所以它假定你指向的类对象实现了这些方法。 最简单的解决scheme是将someClass作为id来调用respondsToSelector: someClass 一个更清洁的解决scheme是声明自己的@protocol声明+respondsToSelector:(SEL)selector ,然后声明someClass如下:

 Class<SomeProtocol, ClassRespondingToSelector> someClass = ... 

最后,请务必在http://bugreporter.apple.com上向Apple提交错误。; 包括一个简单的testing应用程序,以便它非常清楚你在做什么。 他们欢迎这样的错误报告,即使它们已经提交了,因为它可以帮助他们优先处理这些错误。

最后一点:这可能是因为从理论上讲,你可能select了一个完全独立于NSObject的根对象,在这种情况下,它不会响应-respondsToSelector: -[NSObject respondsToSelector:]实际上是在NSObject协议中声明的,而不是类定义。 NSObject协议实际上就是你所知道的大部分NSObject实际所在的地方。 有人可能会说, +respondsToSelector:也应该在那里,但截至目前,它不是。 既然你已经提供了一个协议列表,而且方法不在那里,它会给你一个警告,以确保你知道你在做什么。

那么类方法只是类对象的方法,所以你应该能够做到这一点

 [MyClass respondsToSelector:@selector(...)] 

你可以使用下面的instancesRespondToSelector:自iOS 2.0以来,所以你可以做一个类的实例;

 [myInstance respondsToSelector: @selector(...)]; 

随着一个class,你可以使用

 [myClass instanceRespondsToSelector: @selector(...)]; // or [[myInstance class] instanceRespondsToSelector: @selector(...)]; 

这将像+(BOOL) respondsToSelector

我想你问的是:你可以问一个课,如果它响应+someMethod或不? 换句话说,想到Cocoa Touch API,你会想要:

 [ [ UIView class ] respondsToSelector: @selector( buttonWithType: ) ] -> NO [ [ UIButton class ] respondsToSelector: @selector( buttonWithType: ) ] -> YES 

但是,我上面写的不符合要求。 respondsToSelector:只是关于实例方法。 (因此,这两个调用将返回NO。)在Cocoa API中,没有与一个类相对应的respondsToSelector:

但是,您可以调用class_getClassMethod 。 如果结果是非NULL,那么您所询问的类方法存在的,您可以调用它。

在Objective C中,类也是对象,因此您可以发送对象消息。 特别是,你可以问一个类的-respondsToSelector: 尽pipe如此,您不能将类级别的方法发送给非类对象。