如何测试Objective-C类以确定它是否响应静态选择器(类方法)?

时间:2013-04-10 01:41:11

标签: objective-c

这是一个简单的例子。假设我有以下协议和类定义:

@protocol ProtocolA <NSObject>
@optional
+ (BOOL)methodA;
@end

@interface ClassA : NSObject <ProtocolA>
@end

ClassA可能会也可能不会定义methodA。如果我正在使用ClassA的实例和实例方法,我可以使用respondsToSelector:测试实例。但是,在这种情况下,我无法想出任何干净的方法来确定ClassA是否定义(响应)methodA

修改 我很傻,并没有让我的例子足够具体,这意味着问题的答案并不完全是我问题的解决方案 - 所以我要包含更多的代码和我得到的警告:

Class <ProtocolA> classRef = [ClassA class];

if([classRef respondsToSelector:@selector(methodA)]) {}

以上代码抛出以下警告: “找到实例方法'respondsToSelector:'而不是类方法'respondsToSelector:'”

我刚刚注意到,如果我明确地将classRef强制转换为(Class),那么警告就会消失。我仍然觉得很奇怪。

1 个答案:

答案 0 :(得分:7)

[[instance class] respondsToSelector:@selector(methodA)]

类的每个实例都有一个指向它的类对象的指针,可以通过调用class来检索它。这个对象(类是Objective C中的对象)可以像respondsToSelector:一样用任何其他对象进行探测。