2010-05-27 71 views
0

在过去,我一直使用method_1:但最近我注意到一些人们将其称为超类指定的初始化程序的情况。它是否重要,只是好奇,如果它更多的风格或物质?- (id)init是否使用指定的初始化程序?

Method_1:

-(id)init { 
    self = [super init]; 
    if(self) { 
     //do things ... 
    } 
    return self; 
} 

Method_2:

-(id)init { 
    [super initWithNibName:nil bundle:nil]; 
    // do things ... 
    return self; 
} 

-(id)initWithNibName:(NSString *)nibName bundle:(NSString *)bundle { 
    return [self init]; 
} 

欢呼加里

回答

0

以上的既不使为init基法一类是谁的超类的任何意义上有指定的初始化

- (id)initWithNibName:(NSString *)nibName bundle:(NSString *)bundle 

你想做什么?

4

只有几个实例吗?

苹果文档的Designated initialisers有这样一段关于子类说:

一般原则:一个类中的指定初始化必须通过消息超,调用指定的初始化超类。

另外:

指定的初始值是通过消息超级链接到彼此,而其他初始化方法是通过消息链接到指定的初始值进行自我。

您的方法2是,如果正确的:

  • -initWithNibName:包:是超类的指定初始化器
  • -init是你的类的指定初始化器(你的例子是因为你刻意抛出笔尖名称和捆绑参数)
  • -init被正确编码不会丢弃[super initWithNibName:bundle:]的返回值

在你的课堂上,你必须覆盖所有的超类init方法,以确保你指定的初始化方法最终被调用。

0

指定的初始化器的思想是类的所有其他初始化函数都应该调用它(这只能通过约定来实施)。这很好,因为这意味着编写子类的人可以在初始化时添加额外的步骤,而仅覆盖单个初始化。当使用这种模式时,方法1只应在初始化指定的初始化程序时发生。确保发生这种情况的一个策略如下:

假设C从B继承并让指定的初始值为d_c和d_b。我们重写C中的d_b以使它简单地调用d_c本身。由于d_b被B的所有其他初始化者调用,这确保了子类中存在的所有初始者调用d_c。然后,我们让所有新的初始者都调用d_c。d_c在它的超类B中调用d_b,然后它将进一步将这些调用传递给链上。

请注意,该策略与类经常被初始化的方式相反。例如,一个参数为a:1 b:2的初始化程序可以处理b参数,然后调用另一个只能处理参数a的初始程序。当参数为ab的函数很简单时,指定的初始化器在更复杂的情况下工作得更好,这样可以很好地工作。

相关问题