相当于-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如此,您不能将类级别的方法发送给非类对象。