三个Objective-C构造函数问题

And*_*ant 3 objective-c

我有三个快速的问题,我看到了相互矛盾的答案,希望有人可以清理.

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

从Objective-C开始,我几乎认为是第一个是,而第二个是否,但是我希望保存一些输入:)

谢谢,

phi*_*red 6

只是为了向我前面的三个回复添加一点:

  1. 是的,它确实.在实践中NSObject(可能)不需要它(现在),但是如果你改变了,那么如果你没有,你就会被搞砸.不管怎样,最好养成习惯(或者使用XCode中的代码生成来删除init模板).那说你并不总是init打电话(更快).

  2. 正如已经指出的那样,初始化为默认值(由于memcpy 0s,所以0,nil等)是有保证的,并且依赖于它是合理的惯用语.有些人仍然喜欢明确,这很好.

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

您可以在Apple文档中阅读更多(权威)详细信息.