在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]
这样的Apple对象,我可以假设在NSAppleClass初始化期间最终会调用NSObject的init吗?
答案 0 :(得分: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
在超类上调用,但不在UIView
上调用,因此,如果您要覆盖init
而不是initWithFrame:
,则初始化代码将永远不会运行
答案 1 :(得分:1)
如果我覆盖init,我可以假设它会在某个时刻被调用 在初始化期间?
如果覆盖并init
方法,则负责调用指定的初始值设定项。开发人员有责任调用子类化的类的正确初始值设定项。调用指定初始值设定项的原因是为了确保类的构造处于预期状态。不调用正确的初始化程序或根本不调用初始化程序可能会导致未定义/不良行为。
答案 2 :(得分:0)
是的,“init”默认构造函数不执行spécifique处理
因为NSObject类中定义的init方法没有初始化;它只是回归自我。