ios - 检查子类是否覆盖了一个方法

标签 ios objective-c inheritance

是否可以检查一个子类是否实现了一个方法,该方法存在于其直接父类(super class)或其父类(super class)的某个父类(super class)中,等等?

例如我将 UIView 子类化,为我的应用创建自定义通用 View ,然后将此自定义 View 子类化。现在我的一些子类覆盖了 UIView 中的一些方法,而有些则没有。我只想在实际覆盖时调用此方法,我不想调用默认的 UIView 方法。

有没有办法检查这一点,即使用类似于 respondsToSelector: 的方法?

编辑: 此问题与 Objective-C detect if class overrides inherited method 中提出的问题不同因为我真的不知道或不想关心哪个父类(super class)最初实现了该方法。

最佳答案

基于此answer 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;
}

可以这样调用:

[self checkIfObject:someObject overridesSelector:@selector(someSelector)];

关于ios - 检查子类是否覆盖了一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28737116/

相关文章:

ios - 我可以使用 TabBarItem 上的自定义事件点击来制作自定义 UITabBarController 吗?

ios - Xcode 使用了错误的本地化

ios - swift 中的按钮旋转动画制作类似的动画

iphone - 在 uinavigationcontroller 中推送 safari 浏览器

ios - 如何强制动画在循环中按顺序执行?

java - 子类需要设置父类的唯一对象字段?

ios - 尽管图像远程存在于服务器上,但 SDWebImage 不显示图像

iphone - 我应该如何处理 init : method in Objective-C? 中的故障

java - 在没有构造函数的类上调用 super()

c++ - 我可以让静态函数继承每个类的特定值吗?