检查子类是否覆盖方法

Ban*_*ana 5 inheritance objective-c ios

是否有可能检查子类是否实现了一个存在于其直接超类或其超类的某些超类中的方法等?

例如,我是子类UIView,为我的应用程序创建自定义通用视图,然后我将此自定义视图子类化.现在我的一些子类会覆盖某些方法,UIView而有些方法则不会.我只想调用此方法,如果它实际被覆盖,我不希望UIView调用默认方法.

有没有办法检查这个,即用类似的方法respondsToSelector:

编辑: 这个问题不同于在Objective-C中检测的问题,如果类重写了继承的方法,因为我真的不知道或者不想关心哪个超类最初实现该方法.

ZeM*_*oon 9

根据Mert Buran的回答.

您可以创建一个简单的方法来检查给定对象是否覆盖给定的选择器(方法):

-(BOOL)checkIfObject:(id)object overridesSelector:(SEL)selector {

    Class objSuperClass = [object superclass];
    BOOL isMethodOverridden = NO;

    while (objSuperClass != Nil) {

        isMethodOverridden = [object methodForSelector: selector] !=
        [objSuperClass instanceMethodForSelector: selector];

        if (isMethodOverridden) {
            break;
        }

        objSuperClass = [objSuperClass superclass];
    }

    return isMethodOverridden;
}
Run Code Online (Sandbox Code Playgroud)

这可以如下调用:

[self checkIfObject:someObject overridesSelector:@selector(someSelector)];
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢看到纯粹的Objective-C解决方案.我会使用Objective-C运行时C函数发布一个答案,但这个解决方案更好,恕我直言. (2认同)