如果一个对象符合Objective-C中的某个协议,有没有办法检查它是否符合该协议中的所有方法。我宁愿避免明确检查每个可用的方法。
由于
答案 0 :(得分:5)
您可以使用protocol_copyMethodDescriptionList
获取在协议中声明的所有方法,该方法返回指向objc_method_description
结构的指针。
objc_method_description
在objc/runtime.h
中定义:
struct objc_method_description {
SEL name; /**< The name of the method */
char *types; /**< The types of the method arguments */
};
要查明某个类的实例是否响应选择器,请使用instancesRespondToSelector:
让你有这样的功能:
BOOL ClassImplementsAllMethodsInProtocol(Class class, Protocol *protocol) {
unsigned int count;
struct objc_method_description *methodDescriptions = protocol_copyMethodDescriptionList(protocol, NO, YES, &count);
BOOL implementsAll = YES;
for (unsigned int i = 0; i<count; i++) {
if (![class instancesRespondToSelector:methodDescriptions[i].name]) {
implementsAll = NO;
break;
}
}
free(methodDescriptions);
return implementsAll;
}