我有三个简单的问题我已经看到了相互矛盾的答案,希望有人可以清理。
从Objective-C开始,我几乎认为第一个是Yes,后两个是No,但是我希望保存一些输入:)
谢谢,
答案 0 :(得分:6)
只是在我前面的三个回复中添加一点:
是的。在实践中NSObject
(可能)不需要它(现在),但如果你曾经改变过,那么如果你没有改变,你就会被搞砸。无论如何最好养成习惯(或者使用XCode中的代码生成来删除init模板)。那说你不应该总是init
(更快)。
正如已经注意到初始化为默认值(凭借memcpy 0s,所以0,nil等)得到保证,并且依赖于它是合理惯用的。有些人仍然喜欢明确,这很好。
绝对。记住init,或任何变化只是一种常规方法。它只是一个初始化按惯例(尽管是一个非常强大的惯例)。您可以自由地调用其他方法,包括其他初始化程序。同样,按照惯例,您应该决定“designated initializer”并让所有其他初始化程序调用此方法。想想这与你的第一个问题有关。如果你是子类,你的子类会调用什么?默认情况下,子类作者将调用您的init
- 因此,如果您有一个不同的指定初始值设定项,那么明确这一点非常重要,以便子类作者知道如何调用它。
您可以阅读更多(权威)详细信息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)
init
(技术上不是必需的,但最佳做法)肯定是dealloc
0
,nil
,0.0
等。答案 3 :(得分:0)
是的,否则超类对象将无法进行初始化。
不知道。
是。创建你想要的任何init方法。记录下来。但一定要调用super的正确init方法:无论它是什么。