我在Apple's docs找到了指定初始化程序的一些信息,但我不明白的是,每个班级必须有 一个且只有一个 指定的初始化程序?
例如,如果class A
有initL, initM, initN
,而class B
继承自class A
并且有initX, initY, initZ
,该怎么办?是否有规则说我们无法initX
致电[super initL]
,initY
致电[super initM]
,initZ
致电[super initN]
?< / p>
也就是说,代替所有“辅助初始值设定项”调用指定的初始值设定项,然后每个指定的初始化程序将调用[super initFoo]
,其中initFoo
是超类的指定初始化程序,我们不能只有3主要初始化器,每个调用者对应的超类的3个主要初始化器? (并且说,这些都继承自NSObject
,只需致电self = [super init]
。)
答案 0 :(得分:4)
不,obj-c类可能有多个指定的初始值设定项。最常见的示例是-initWithCoder:
vs -init
。前者在取消归档对象时使用,后者用于所有其他初始化。
也就是说,通常只有-initWithCoder:
之外只有一个指定的初始值设定项。这有助于防止代码重复,并且如果要为所有初始化调用子类,子类必须覆盖哪个方法。但是如果你有一个很好的理由需要3个不同的指定初始化器,那么就没有什么能阻止你这么做了。请务必妥善记录。
答案 1 :(得分:2)
指定的初始值设定项是一个有助于防止递归调用并省略重要基类初始化的概念。可能不遵循指定的初始化程序规则,仍然构建工作类层次结构。
事实上,Cocoa中的模式与纯指定初始化有所不同:例如,NSCoding需要使用initWithCoder:
初始化对象,但您仍然可以使用其他初始化程序从代码初始化对象。