2012-08-13 31 views
3

在Cocoa中,建议始终调用超类的指定初始值设定项。假设在对象初始化期间始终调用init,即使对象未使用init初始化,是否安全?是否始终调用NSObject init?

例如,如果我们假设有一个类:NSThingie,它可以初始化为[[NSThingie alloc] initWithFoo: foo][[NSThingie alloc] initWithFoo: foo andBar: bar]。如果我覆盖初始化,我可以假定它会在初始化过程中的某个时刻被调用吗?


编辑

也许我原来的问题没有措辞这么好。我知道覆盖init会导致超类中的init不被调用,我必须明确地调用init。我想知道的是,在苹果框架中,是否总是调用[NSObject init]。如果我初始化一些Apple对象,如[[NSAppleClass alloc] initWithSomething: something],我是否可以假定在NSAppleClass的初始化过程中最终会调用NSObject的init?

+0

见http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html有用的信息 – jrturton 2012-08-13 13:49:07

回答

1

如果我覆盖初始化,我可以假设它会在初始化过程中的某个点 被调用吗?

如果您覆盖并调用init方法负责调用指定的初始化程序。开发人员有责任调用子类的正确初始化方法。你称之为指定的初始化器的原因是为了确保这个类被构造成它的预期状态。不调用正确的初始化程序或根本不调用初始化程序可能会导致未定义/不受欢迎的行为。

+0

任何特定为什么这个答案被拒绝投票而不是其他人? – Joe 2012-08-13 13:53:05

0

是“init”的默认构造函数不会执行精确处理
因为NSObject类中定义的init方法没有初始化;它只是返回自我。

4

简短的回答:没有

,你需要确保你将覆盖你正在使用

例如UIView类正确init方法有一个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,所以如果你要OVERR IDE init而不是initWithFrame:你的初始化代码永远不会被运行

相关问题