我在苹果的文档中找到了一些指定初始化器的信息,但我不明白的是,每个类必须有一个且只有一个指定初始化器吗?
例如,如果class A
具有initL, initM, initN
,而class B
继承自class A
并具有initX, initY, initZ
,该怎么办。有没有一条规则说我们不能让initX
调用[super initL]
,initY
调用[super initM]
,initZ
调用[super initN]
?
也就是说,不是所有的"辅助初始化器"都调用指定的初始化器,然后每个指定的初始化程序都会调用[super initFoo]
,其中initFoo
是超类的指定初始化器,难道我们不能只有3个主初始化器,每个调用程序都有对应的超类的3个主初始值设定器吗?(也就是说,这些都继承自NSObject
,只调用self = [super init]
。)
否,一个obj-c类可能有多个指定的初始化程序。最常见的例子是-initWithCoder:
与-init
。前者用于取消对对象的初始化,后者用于所有其他初始化。
也就是说,通常在-initWithCoder:
之外只有一个指定的初始值设定项是很好的做法。这有助于防止代码重复,并清楚地表明,如果子类希望在所有初始化中被调用,则必须覆盖哪个方法。但是,如果你有一个很好的理由需要3个不同的指定初始化程序,那么没有什么可以阻止你这样做。只要确保正确地记录它。
指定初始化程序是一个概念,有助于防止递归调用和省略重要的基类初始化。可以不遵循指定的初始值设定项规则,仍然构建工作类层次结构。
事实上,Cocoa中有一些模式偏离了纯指定的初始化:例如,NSCoding要求使用initWithCoder:
初始化对象,但您仍然可以使用其他初始化器从代码中初始化对象。