如何检查类是否实现了Obj-C协议中的所有方法?

时间:2014-02-13 23:10:20

标签: objective-c protocols

如果一个对象符合Objective-C中的某个协议,有没有办法检查它是否符合该协议中的所有方法。我宁愿避免明确检查每个可用的方法。

由于

1 个答案:

答案 0 :(得分:5)

您可以使用protocol_copyMethodDescriptionList获取在协议中声明的所有方法,该方法返回指向objc_method_description结构的指针。

objc_method_descriptionobjc/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;
}