objective-c - 在编译时 super 静态绑定(bind)?

标签 objective-c

我想创建一个具有基类和 2 个子类的类集群。创建基类的实例应该根据某些条件返回子类,但是直接创建子类应该创建它。我在基类中写了如下代码:

+ (id)allocWithZone:(NSZone *)zone {
    // prevent infinite recursion
    if ([self isEqual:Base.class]) {
        // if self is the base class, return a correct subclass
        if (somecondition) {
            return [SubclassA alloc];
        }
        return [SubclassB alloc];
    }
    // otherwise, alloc is called on a subclass
    // call NSObject's alloc
    return [super allocWithZone:zone];
}

它确实有效,但我真的很惊讶它确实如此。即,当在子类上调用时,为什么 super 计算为 Base 类的父类(super class) (NSObject),而不是 Base 类(因为在 SubclassA 上调用,父类(super class)是 Base)?就好像从 Base 继承的 allocWithZone: 方法调用总是相对于 Base 计算 super,而不是调用者的真正运行时类。我认为 Java 和其他 OO 语言中的类似代码不会起作用并导致无限递归,对吗?这段代码有错吗?

最佳答案

您的代码是正确的。 [super ...] 始终使用实现该方法的类的父类(super class)。在您的代码中,+allocWithZone: 由类 Base 实现,因此 [super allocWithZone:zone] 使用 Base搜索下一个要调用的 +allocWithZone: 实现时的父类(super class)。

关于objective-c - 在编译时 super 静态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21796083/

相关文章:

ios - UIPickerView 为空

ios - 单击注释时如何访问可用数据?

ios - 由于复杂的 segue,在 Controller 之间传递数据会产生错误

objective-c - 如何在xcode中组织资源

ios - AVAudioPlayer速率变化会引入失真/失真

ios - 在 heightForRowAtIndexPath 之后获取单元格中的更新行高

ios - Fabric - 无法完成设置下载

ios - 如何将 tabBarController 设置为 rootViewController

iphone - 我希望通过iPhone中的贪睡功能在选定的时间每天重复闹钟

objective-c - 如何在 Mac OS X 下阻止/更改系统范围的键盘/鼠标事件?