3

我在这个Apple's docs中找到了指定初始化程序的一些信息,但我不明白的是,每个类必须有一个且只有一个指定初始化程序吗?

例如, if class Ahas initL, initM, initN, whileclass B继承自class Aand has怎么办initX, initY, initZ。有没有一条规则说我们不能有initXcall [super initL], and initYcall [super initM], and initZcall [super initN]

也就是说,不是所有的“辅助初始化器”都调用指定初始化器,然后每个指定初始化器都会调用[super initFoo]initFoo类的指定初始化器,我们不能只有3个主初始化器,每个调用者对应的超类的3个主初始化器? (也就是说,这些都继承自NSObject并只是调用self = [super init]。)

4

2 回答 2

4

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

也就是说,在-initWithCoder:. 这有助于防止代码重复,并且如果要为所有初始化调用子类,则必须重写哪个方法很明显。但是,如果您有很好的理由需要 3 个不同的指定初始化程序,那么没有什么可以阻止您这样做。请务必正确记录它。

于 2013-02-22T21:56:37.020 回答
2

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

事实上,Cocoa 中有一些模式与纯指定初始化不同:例如 NSCoding 需要使用initWithCoder:初始化对象,但您仍然可以使用其他初始化程序从代码中初始化对象。

于 2013-02-22T21:58:01.660 回答