1

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW55声明应该有一个设计的初始化程序,并且其他初始化程序应调用设计的初始化程序。

1. 造成这种情况的主要原因是什么?我的意思是,每个辅助初始化器都可以自己调用 [super init](因此成为设计的初始化器)。

2. 一个后续问题:辅助节点和设计的初始化程序之间的每次调用都会生成一个消息传递步骤,还是编译器有什么办法可以避免这种情况?由于初始化程序毕竟在同一个文件中......如果引入了消息传递步骤,我认为问题 1 更相关。

4

1 回答 1

2

具有指定初始化程序的两个主要原因是简单性和子类化。如果您有许多初始化程序,每个初始化程序都必须完成所有工作,这意味着您必须将初始化代码复制到每个初始化程序中。由于所有辅助初始化程序都调用相同的指定初始化程序,大部分初始化代码可以放在一个地方,而其他每个只需要进行小的更改。

对于子类化,请考虑具有许多初始化程序的类 A 和作为 A 的子类的类 B 的情况。如果 A 具有指定的初始化程序,则 B 只需覆盖该方法即可捕获每个初始化。但是如果 A 的初始化器不调用单个方法,那么 B 必须覆盖每个方法,否则它不会总是有机会初始化它的对象。

是的,当您调用指定的初始化程序时,会发送一条消息。虽然编译器可以直接调用该方法,但由于语言的动态特性以及子类化的可能性,它不会。在上面的例子中,如果 A 使用了指定的初始化器但没有发送消息,那么 B 的指定初始化器仍然不会被调用。传递消息允许运行时找到具有该方法的第一个类。此外,由于语言是动态的,因此指定的初始化程序的地址可能会在运行时更改,方法是加载重新定义它的类别,或者使用运行时调用直接更改它。

于 2012-10-15T16:29:25.163 回答