3

在 Cocoa 中,建议始终调用超类的指定初始化程序。假设在对象初始化期间总是会调用 init 是否安全,即使对象没有使用 init 进行初始化?

例如,假设有一个类:NSThingie,它可以像[[NSThingie alloc] initWithFoo: foo], 或一样初始化[[NSThingie alloc] initWithFoo: foo andBar: bar]。如果我重写 init,我可以假设它会在初始化期间的某个时候被调用吗?


编辑

也许我最初的问题措辞不太好。我知道重写 init 会导致超类中的 init 不被调用,我必须显式调用 init。我想知道的是,在苹果框架中,[NSObject init]是否总是被调用。如果我初始化一些 Apple 对象[[NSAppleClass alloc] initWithSomething: something],我可以假设 NSObject 的 init 最终会在 NSAppleClass 的初始化过程中被调用吗?

4

3 回答 3

4

简短的回答:没有

您需要确保init为正在使用的类覆盖正确的方法

例如UIView有一个 init 方法initWithFrame:,一个非常基本的实现是:

- (id)initWithFrame:(CGRect)frame
{
    self = [super init]; //calls init because UIResponder has no custom init methods
    if (self){
        self.frame = frame;
    }
    return self;
}

init在超类上被调用,但不是 on UIView,所以如果你要覆盖init而不是initWithFrame:你的初始化代码将永远不会运行

于 2012-08-13T13:50:33.323 回答
1

如果我重写 init,我可以假设它会在初始化期间的某个时候被调用吗?

如果您覆盖和init方法,您有责任调用指定的初始化程序。开发人员有责任调用子类化类的正确初始化程序。调用指定初始化程序的原因是确保类在其预期状态下构造。不调用正确的初始化程序或根本不调用初始化程序可能会导致未定义/不良行为。

于 2012-08-13T13:46:07.583 回答
0

是的,“init”默认构造函数不进行特殊处理
,因为 NSObject 类中定义的 init 方法不进行初始化;它只是返回自我。

于 2012-08-13T13:48:44.247 回答