Objective c 如何检查一个类是否在Obj-C中实现了协议中的所有方法?
如果一个对象符合Objective-C中的某个协议,是否有方法检查它是否符合该协议中的所有方法。我宁愿避免显式地检查每个可用的方法Objective c 如何检查一个类是否在Obj-C中实现了协议中的所有方法?,objective-c,protocols,Objective C,Protocols,如果一个对象符合Objective-C中的某个协议,是否有方法检查它是否符合该协议中的所有方法。我宁愿避免显式地检查每个可用的方法 谢谢您可以使用协议\u copyMethodDescriptionList获取协议中声明的所有方法,该列表返回指向对象方法\u描述结构的指针 objc\u方法\u说明在objc/runtime.h中定义: struct objc_method_description { SEL name; /**< The name of
谢谢您可以使用
协议\u copyMethodDescriptionList
获取协议中声明的所有方法,该列表返回指向对象方法\u描述
结构的指针
objc\u方法\u说明
在objc/runtime.h
中定义:
struct objc_method_description {
SEL name; /**< The name of the method */
char *types; /**< The types of the method arguments */
};
默认情况下,协议方法是必需的,因此如果一个类采用给定的协议,它应该实现所有未标记为
@optional
@NoahWitherspoon的方法。我不是问如何检查协议的一致性。我想问的是如何检查实际协议中的方法是否都实现了,可能是通过有一个循环来为协议的每个方法调用respondsToSelector。要有协议的方法,请检查这不是重复的。检查类是否实际实现了协议中声明的方法。内存泄漏如果类没有实现协议中的所有方法,请添加free(methodDescrptions);在返回之前没有;或者最好在找不到的时候加个旗子,打破循环。伙计们,一个词…坏蛋。感谢塞巴斯蒂安的回答,并感谢@Johnmph的后续评论。@Johnmph谢谢,接得好!我将我的答案更新为一个返回语句。
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;
}