是否有等同于-respondsToSelector:的类方法
像+respondsToSelector:这样的东西
我问这个问题的原因是,通过在类级别上实现-respondsToSelector:,我得到了一个编译器警告:“在协议中找到'-respondsToSelector:‘而不是'+respondsToSelector:’”。
代码如下所示:
Class <SomeProtocol> someClass = [someInstance class];
if ([someClass respondsToSelector:@selector(someSelector:)]) {
someVar = [someClass someSelector:someData];
}发布于 2009-07-16 05:21:11
查看您的编辑后的更新:
正如您可能知道的那样,类对象可以很好地响应respondsToSelector:。在测试应用程序中,我可以执行以下两项操作,而不会出现任何编译器警告:
NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]);
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]);但是,您已经在变量上声明了一个协议,因此它假定您所指向的类对象实现了这些方法。最简单的解决方案是将someClass转换为id,以便调用respondsToSelector:。一种更简洁的解决方案是声明您自己的@protocol,它声明+respondsToSelector:(SEL)selector,然后按如下方式声明someClass:
Class<SomeProtocol, ClassRespondingToSelector> someClass = ...最后,一定要在http://bugreporter.apple.com上向苹果提交一个bug。包括一个简单的测试应用程序,以便非常清楚您在做什么。他们欢迎这样的bug报告,即使他们过去已经提交过,因为这有助于他们确定修复的优先顺序。
最后注意:这可能是因为从理论上讲,您可以选择实现一个完全独立于NSObject的根对象,在这种情况下,它不会响应-respondsToSelector:。-[NSObject respondsToSelector:]实际上是在NSObject协议中声明的,而不是类定义。您所知的大多数NSObject协议实际上都位于NSObject协议中。有人可能会争辩说,+respondsToSelector:也应该在那里,但到目前为止,它还没有。由于您已经提供了一个协议列表,而该方法不在其中,因此它会给您一个警告,以确保您知道自己在做什么。
发布于 2009-07-16 04:30:59
类方法只是类对象的一个方法,所以您应该能够做到这一点
[MyClass respondsToSelector:@selector(...)]发布于 2013-02-21 01:43:37
从iOS 2.0开始,您可以使用以下instancesRespondToSelector:,因此,对于类的实例,您可以这样做;
[myInstance respondsToSelector: @selector(...)];使用一个您可以使用的类
[myClass instanceRespondsToSelector: @selector(...)];
// or
[[myInstance class] instanceRespondsToSelector: @selector(...)];它的行为将类似于+(BOOL) respondsToSelector
https://stackoverflow.com/questions/1135366
复制相似问题