2010-02-12 128 views
3

我有三个简单的问题,我看到了相互冲突的答案,希望有人可以清理。三个Objective-C构造函数问题

  • [super init]是否需要一直到NSObject? (例如,如果Foo继承自NSObject,Foo应该调用[super init]吗?如果不是,那么它是否也适用于dealloc?
  • 是否有任何形式的默认初始化会发生在对象中的成员变量。例如,NSString *成员被初始化为nil?漂浮到0.0?
  • 如果我的对象具有一个initFoo方法,我可以调用[自INIT]该函数内执行常见的初始化?

由于与目标C我已经开始几乎假设是的第一个和没有为第二个,但我希望保存一些打字:)

谢谢,

回答

6

只是为了增加一点三个回复我前面:

  1. 是它。在实践中NSObject(可能)不需要它(现在),但如果改变了,如果你没有改变,你就会被搞砸。无论如何,最好还是养成习惯(或者使用XCode中的代码来放下init模板)。这表示并不总是您应该致电init(更快)。

  2. 正如已经注意到的初始化默认值(凭借memcpy 0s,所以0,零等)是有保证的,并且依赖于这个是合理的习惯。有些人仍然喜欢明确,这很好。

  3. 绝对如此。记住初始化,或任何变化只是一个正常的方法。这只是一个初始化者按照惯例(尽管是一个非常强大的惯例)。您可以自由调用其他方法,包括其他初始者。同样,按照惯例,你应该决定一个“designated initializer”,并让所有其他初始化者称这个。考虑一下你的第一个问题。如果你继承,你的子类会调用什么?默认情况下,一个子类作者会调用你的init--所以如果你有一个不同的指定初始化器,那么你明确的做出这样的决定非常重要,以便子类作者知道它叫它。

您可以阅读更多(权威)详细信息here in the Apple docs

0
  1. 是为init(不是技术上必需的,但最好的做法)肯定是有的为dealloc
  2. 是的,所有的记忆被初始化为0这是nil0.0
  3. 是的,这是常见的
2

您总是需要调用超类的初始化方法并将self赋值给结果。在执行-dealloc结束时,您还一定需要致电super的实施。

默认情况下,所有实例变量初始化为零/零,这是有保证的。

是的,你甚至可以从一个更具体的初始化方法[self init]

- (id)initFoo 
{ 
    self=[self init]; 
    if(self) 
    { 
     //do stuff 
    } 
    return self; 
} 
0
  • 是的,否则超类对象不会有机会做自己的初始化。

  • 不知道。

  • 是的。创建你想要的任何init方法。记录它。但一定要调用super的正确init方法:不管它是什么。