这是一个简单的例子。假设我有以下协议和类定义:
@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)
,那么警告就会消失。我仍然觉得很奇怪。
答案 0 :(得分:7)
[[instance class] respondsToSelector:@selector(methodA)]
类的每个实例都有一个指向它的类对象的指针,可以通过调用class
来检索它。这个对象(类是Objective C中的对象)可以像respondsToSelector:
一样用任何其他对象进行探测。