Objective-C类必须只有一个指定的初始值设定项



我在苹果的文档中找到了一些指定初始化器的信息,但我不明白的是,每个类必须有一个且只有一个指定初始化器吗?

例如,如果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:初始化对象,但您仍然可以使用其他初始化器从代码中初始化对象。

相关内容

  • 没有找到相关文章

最新更新