是否存在等同于-respondsToSelector:
的类方法?
像+respondsToSelector:
?
我问的原因是因为通过在类级别实现-respondsToSelector:
,我得到一个编译器警告:“找到'-respondsToSelector:'而不是'protocol中的'respondsToSelector:'”。< / p>
代码如下所示:
Class <SomeProtocol> someClass = [someInstance class];
if ([someClass respondsToSelector:@selector(someSelector:)]) {
someVar = [someClass someSelector:someData];
}
答案 0 :(得分:82)
看到您的修改后更新:
一个类对象响应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向Apple提交错误。包括一个简单的测试应用程序,以便您清楚地了解自己在做什么。他们欢迎这样的错误报告,即使它们已经过去提交过,因为它可以帮助他们确定修复的优先顺序。
最后注意:这可能正在发生,因为从理论上讲,你可以选择实现一个完全独立于NSObject的根对象,在这种情况下,它不会响应{{1} }。 -respondsToSelector:
实际上是在-[NSObject respondsToSelector:]
协议中声明的,而不是类定义。 NSObject
协议实际上是您所知道的NSObject
大部分实际存在的地方。有人可能会说NSObject
也应该在那里,但截至目前,它并非如此。既然你已经提供了一个协议列表,并且该方法不在那里,它会给你一个警告,以确保你知道你正在做什么。
答案 1 :(得分:9)
类方法只是类对象的一种方法,所以你应该能够做到这一点
[MyClass respondsToSelector:@selector(...)]
答案 2 :(得分:5)
从iOS 2.0开始,您可以使用以下instancesRespondToSelector:
,所以您可以使用类的实例;
[myInstance respondsToSelector: @selector(...)];
有了课程,你可以使用
[myClass instanceRespondsToSelector: @selector(...)];
// or
[[myInstance class] instanceRespondsToSelector: @selector(...)];
其行为类似于+(BOOL) respondsToSelector
答案 3 :(得分:1)
我认为你问的问题是:如果一个班级对+someMethod
做出回应,你能问他吗?换句话说,想到Cocoa Touch API,你会想要:
[ [ UIView class ] respondsToSelector: @selector( buttonWithType: ) ] -> NO
[ [ UIButton class ] respondsToSelector: @selector( buttonWithType: ) ] -> YES
但我上面写的内容并没有按预期工作。 respondsToSelector:
仅与实例方法有关。 (因此两个调用都将返回NO。)在Cocoa API中,类没有等同于respondsToSelector:
。
但是,您可以致电class_getClassMethod
。如果结果为非NULL,则您询问的的类方法是,您可以调用它。
答案 4 :(得分:0)
在Objective C中,类也是对象,因此您可以发送对象消息。特别是,您可以询问课程的-respondsToSelector:
。但是,您不能将类级方法发送到非类对象。