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

Mat*_*hew 3 objective-c

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

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

@interface ClassA : NSObject <ProtocolA>
@end
Run Code Online (Sandbox Code Playgroud)

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

编辑: 我很傻,并没有让我的例子足够详细,这意味着问题的答案并不完全是我的问题的解决方案 - 所以我包括更多的代码和我得到的警告:

Class <ProtocolA> classRef = [ClassA class];

if([classRef respondsToSelector:@selector(methodA)]) {}
Run Code Online (Sandbox Code Playgroud)

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

我刚刚注意到,如果我明确地施展classRef,(Class)那么警告就会消失.我仍觉得奇怪.

Lan*_*nce 7

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

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