【问题标题】:Find out if an Objective-C class overrides a method [duplicate]找出Objective-C类是否覆盖了方法[重复]
【发布时间】:2015-06-30 19:17:59
【问题描述】:

如何在运行时确定一个类是否覆盖了其超类的方法?

例如,我想知道一个类是否有自己的isEqual:hash 实现,而不是依赖于超类。

【问题讨论】:

  • 请澄清。您是在谈论在文档中查找某些内容吗?某种运行时检查?什么?
  • @rmaddy 他显然是在询问是否检查子类是否包含在其超类中声明的方法的自定义实现。而且问题还包含objective-c运行时标签。
  • @DominikHadl 是的,这正是我想要的。我想在运行时执行此操作。假设我没有该类的文档。
  • 虽然这是一个有趣的问题,但如果在生产代码中使用,我会认为它是代码异味。
  • @vikingosegundo 这是用于单元测试代码,而不是生产。

标签: objective-c cocoa introspection objective-c-runtime


【解决方案1】:

您只需要获取方法列表,然后查找所需的方法:

#import <objc/runtime.h>

BOOL hasMethod(Class cls, SEL sel) {
    unsigned int methodCount;
    Method *methods = class_copyMethodList(cls, &methodCount);

    BOOL result = NO;
    for (unsigned int i = 0; i < methodCount; ++i) {
        if (method_getName(methods[i]) == sel) {
            result = YES;
            break;
        }
    }

    free(methods);
    return result;
}

class_copyMethodList 只返回直接在相关类上定义的方法,而不是超类,所以这应该是你的意思。

如果您需要类方法,请使用class_copyMethodList(object_getClass(cls), &amp;count)

【讨论】:

  • 太好了,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多