【问题标题】:Designated Initializer?指定初始化器?
【发布时间】:2023-04-09 23:39:01
【问题描述】:

苹果文档中所说的这句话是什么:

有时父类的指定初始化器可能对子类就足够了,因此子类不需要实现自己的指定初始化器。其他时候,类的指定初始化器可能是其超类的指定初始化器的重写版本。当子类需要补充由超类的指定初始化程序执行的工作时,通常会出现这种情况,即使子类没有添加它自己的任何实例变量(或者它添加的实例变量不需要显式初始化)。

Apple's Documentation

是说我不必为子类创建指定的初始化程序,而超类的指定初始化程序就足够了,如果是这样,子类的属性将如何初始化?如果允许,在什么情况下?那将如何运作?

此外,如果您覆盖 DI,您如何从子类调用该方法,因为父类具有与您相同的 DI?需要补充工作是什么意思?

【问题讨论】:

    标签: ios objective-c inheritance init designated-initializer


    【解决方案1】:

    例子:

    有一个超类 A 和一个 initWithName: DI。

    现在您创建子类B。如果您想要相同的 DI 并且不需要任何额外的初始化,那么与 init 方法无关。您只需调用:

    B *someBObject = [[B alloc] initWithName:@"A Name"];
    

    这将创建B 对象并从A 调用initWithName: 方法。

    现在如果您的B 类需要在initWithName: 方法中做补充工作,那么您将其添加到B.m

    - (instancetype)initWithName:(NSString *)name {
        self = [super initWithName:name];
        if (self) {
            // do some additional stuff to initialize this "B" instance
        }
    
        return self;
    }
    

    【讨论】:

    • 对于第一部分,您所说的是在我的子类中没有任何 init 方法但我确实有其他方法和属性但是如果调用 DI init 方法将属性和方法在子类中也被初始化?还是只是被初始化的父类和向上类?
    • 如果子类中有任何必须初始化的东西,那么您的子类必须覆盖所有需要的初始化器,以便正确初始化这些值。
    猜你喜欢
    • 1970-01-01
    • 2014-07-27
    • 2020-08-10
    • 2015-02-24
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多