【问题标题】:How can I check if a class implements all methods in a protocol in Obj-C?如何检查一个类是否实现了 Obj-C 协议中的所有方法?
【发布时间】:2014-02-13 23:10:19
【问题描述】:

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

谢谢

【问题讨论】:

  • 默认需要协议方法,所以如果一个类采用给定的协议,它应该实现所有那些没有标记@optional的方法。
  • @NoahWitherspoon 我不是在问如何检查是否符合协议。我在问如何检查实际协议中的方法是否都实现了。
  • 也许通过为协议的每个方法调用 respondsToSelector 的循环。并有协议的方法,检查这个stackoverflow.com/questions/2094702/…
  • 这不是重复的。它是关于检查类是否真正实现了协议中声明的方法。

标签: objective-c protocols


【解决方案1】:

您可以使用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;
}

【讨论】:

  • 如果类没有实现协议的所有方法,内存泄漏,添加free(methodDescrptions);在返回 NO 之前;甚至更好地添加一个标志并在找不到时打破循环。
  • 伙计们一句话......坏蛋。感谢 Sebastian 的精彩回答,并感谢 @Johnmph 的后续评论。
  • @Johnmph 谢谢,很好!我将我的答案更新为单个返回语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2021-10-19
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多