关于覆盖init函数的几个问题

时间:2011-06-07 13:48:44

标签: iphone objective-c xcode initialization

作为Objective-C的初学者,我对init函数以及如何以及何时覆盖它非常困惑。所以这里有几个问题:

  • 显然,当init函数没有被覆盖时它工作正常,所以这样做是一个好习惯吗?如果是,那么不这样做是非常糟糕的做法吗?
  • 让我们假设我重写了这个函数,因为我必须为变量赋一个默认值。我是否必须分配和初始化所有其他ivars,包括IBOutlets?

请注意我知道语法:

if ((self = [super init]))
{
    _foo = [[Bar alloc] init];
}
return self;

3 个答案:

答案 0 :(得分:5)

"Initialization"

  

类通常为其对象实现初始化程序,但不是必需的。如果一个类没有实现初始化器,Cocoa会调用该类最近的祖先的初始化器。但是,子类通常定义自己的初始化程序或覆盖其超类的初始化程序以添加特定于类的初始化。如果一个类确实实现了初始化器,那么它应该调用其超类的初始化器作为第一步。此要求确保从继承链向下对象的一系列初始化,从根对象开始。 NSObject类将init方法声明为默认对象初始值设定项,因此始终在最后调用但首先返回。

如上所述,当您需要在初始化完成后进行初始化时,可以覆盖超类的指定初始化程序。不需要这样做?然后你不需要覆盖。

当您的对象从NIB实例化时,不会调用-init。相反,新分配的对象将收到-initWithCoder:-initWithFrame:消息,具体取决于对象的类型。 NIB加载过程在其之后发送您的对象-awakeFromNib,并且已经建立了它引用的所有其他NIB创建的对象。这样,当您希望在加载NIB后进行某些配置时,可以避免覆盖-initWithCoder: / -initWithFrame:。如果您可以通过覆盖-awakeFromNib而不是初始化程序来执行您想要执行的操作,那么您应该这样做。

另请参阅"Multiple Initializers",其中解释了“指定初始值设定项”概念以及不同类如何具有不同的指定初始值设定项,以及"Allocating and Initializing Objects"用于不太友好但更深入的分配和初始化描述Objective-C采用的惯例。

答案 1 :(得分:4)

除非您需要进行特定于类的初始化,否则无需重写-init(或指定的初始值设定项)。

您不需要(也不应该)分配或初始化IBOutlets。 Objective-C将自动初始化所​​有实例变量,包括IBOutlets到0(nil)。

答案 2 :(得分:0)

一点也不....只是初始化你想要的东西......再次IBOutlets没有被初始化...你只有在有内存警告时或者你想要打破链接时才将它们设置为nil。 ...