始终使用指定的初始化程序

时间:2012-10-15 13:42:02

标签: objective-c

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更具相关性。

1 个答案:

答案 0 :(得分:2)

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

对于子类化,考虑具有许多初始值设定项的类A的情况,以及作为A的子类的类B.如果A具有指定的初始值设定项,则B只需要覆盖该一个方法以便捕获每个初始化。但是如果A的初始化器没有调用单个方法,那么B必须覆盖每个方法,否则它不会总是有机会初始化它的对象。

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