三个Objective-C构造函数问题

时间:2010-02-12 08:33:34

标签: objective-c

我有三个简单的问题我已经看到了相互矛盾的答案,希望有人可以清理。

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

从Objective-C开始,我几乎认为第一个是Yes,后两个是No,但是我希望保存一些输入:)

谢谢,

4 个答案:

答案 0 :(得分:6)

只是在我前面的三个回复中添加一点:

  1. 是的。在实践中NSObject(可能)不需要它(现在),但如果你曾经改变过,那么如果你没有改变,你就会被搞砸。无论如何最好养成习惯(或者使用XCode中的代码生成来删除init模板)。那说你不应该总是init(更快)。

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

  3. 绝对。记住init,或任何变化只是一种常规方法。它只是一个初始化按惯例(尽管是一个非常强大的惯例)。您可以自由地调用其他方法,包括其他初始化程序。同样,按照惯例,您应该决定“designated initializer”并让所有其他初始化程序调用此方法。想想这与你的第一个问题有关。如果你是子类,你的子类会调用什么?默认情况下,子类作者将调用您的init - 因此,如果您有一个不同的指定初始值设定项,那么明确这一点非常重要,以便子类作者知道如何调用它。

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

答案 1 :(得分:2)

您始终需要调用超类的初始化方法并将self分配给结果。您还必须在super的实施结束时调用-dealloc的实施。

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

是的,您可以通过更具体的初始化方法调用[self init]

- (id)initFoo
{
    self=[self init];
    if(self)
    {
       //do stuff
    }
    return self;
}

答案 2 :(得分:0)

  1. 是的,init(技术上不是必需的,但最佳做法)肯定是dealloc
  2. 是的,所有内存都初始化为0nil0.0等。
  3. 是的,这很常见

答案 3 :(得分:0)

  • 是的,否则超类对象将无法进行初始化。

  • 不知道。

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