类方法等效于-respondsToSelector:

时间:2009-07-16 04:21:04

标签: objective-c cocoa cocoa-touch

是否存在等同于-respondsToSelector:的类方法?

+respondsToSelector:

之类的东西

我问的原因是因为通过在类级别实现-respondsToSelector:,我得到一个编译器警告:“找到'-respondsToSelector:'而不是'protocol中的'respondsToSelector:'”。< / p>

代码如下所示:

Class <SomeProtocol> someClass = [someInstance class];

if ([someClass respondsToSelector:@selector(someSelector:)]) {
    someVar = [someClass someSelector:someData];
}

5 个答案:

答案 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:。但是,您不能将类级方法发送到非类对象。