2013-02-22 60 views
3

我在这Apple's docs中发现了指定初始值设定项的一些信息,但是我不明白的是,每个类都必须有指定初始值设定项吗?是唯一一个Objective-C类必须有一个指定的初始化程序吗?

例如,如果class AinitL, initM, initN,而从class Aclass B继承和具有initX, initY, initZ。是否有规则说我们不能有initX致电[super initL]initY致电[super initM]initZ致电[super initN]

也就是说,不是所有的“二次初始化”拨打指定初始化,然后将每个指定的初始化将调用[super initFoo]其中initFoo是超类的指定初始化,我们不能仅仅有3个主要的初始化,以及每一个呼叫者其相应的超类的3个主要初始化器? (也就是说,这些全部都是从NSObject继承而来,只是调用self = [super init]。)

回答

4

不,一个obj-c类可能有多个指定的初始值设定项。最常见的例子是-initWithCoder: vs -init。前者用于取消存档对象,后者用于所有其他初始化。

也就是说,在-initWithCoder:之外只有一个指定的初始化程序是一种很好的做法。这有助于防止代码重复,并且明确了如果要为所有初始化调用子类,必须重写哪个方法。但是,如果你有需要3个不同的指定初始化器的好例子,那么没有什么能阻止你这样做。请确保正确记录它。

+0

根据[文档](https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell),“NSCell”甚至有4个指定的初始值设定项。 html%23 // apple_ref/doc/uid/TP40004017):init,initWithCoder,initTextCell和initImageCell: – Monolo 2013-02-22 22:00:24

+0

@Monolo:'initTextCell:'和'initImageCell:'大概调用'[self init]' – 2013-02-22 22:02:21

+0

同意,但是文档明确地将它们列为指定的初始值设定项。不过,我一直在想,这是否是文档中的一个错误。 – Monolo 2013-02-22 22:07:36

2

指定的初始值设定项是一个概念,它有助于防止递归调用并省略重要的基类初始化。有可能不遵循指定的初始化规则并且仍然构建工作类层次结构。

事实上,Cocoa中存在与纯粹的指定初始化不同的模式:例如NSCoding需要使用initWithCoder:来初始化对象,但是您仍然可以使用其他初始化器初始化代码中的对象。

相关问题