3

用一个简短的例子可以很容易地解释这一点。假设我有以下协议和类定义:

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

@interface ClassA : NSObject <ProtocolA>
@end

ClassA可以定义也可以不定义methodA。如果我正在使用 的实例ClassA和实例方法,我可以使用respondsToSelector:. 但是,在这种情况下,我想不出任何干净的方法来确定 if ClassAdefined (respons to) methodA

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

Class <ProtocolA> classRef = [ClassA class];

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

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

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

4

1 回答 1

7

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

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

于 2013-04-10T01:42:56.790 回答