3

考虑http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html中的以下文本。

创建子类时,继承的初始化程序是一个问题。有时,超类 init... 方法可以充分初始化您的类的实例。但是因为它很可能不会,所以你应该重写超类的初始化器。如果不这样做,则会调用超类的实现,并且由于超类对您的类一无所知,因此您的实例可能无法正确初始化。

在同一页面上,我找到了这段文字:

每个声明实例变量的对象都应该实现一个初始化方法——除非默认的将一切设置为零初始化就足够了。

我的问题是:如果我跳过 B 类从 A 继承的 B 类中的 init 方法,我可以相信 B 的非继承成员变量设置为零吗?

4

2 回答 2

2

我的问题是:如果我跳过 B 类从 A 继承的 B 类中的 init 方法,我可以相信 B 的非继承成员变量设置为零吗?

Objective-C 会将任何新对象的所有 ivars 设置为零

alloc 方法为新对象的实例变量动态分配内存,并将它们全部初始化为 0 — 全部,即除了将新实例连接到其类的 isa 变量。为了使一个对象有用,它通常需要更完整地初始化。这就是 init 方法的功能。

因此,如果您没有任何需要初始化的 ivars/属性,则可以跳过为您的类实现初始化方法。当然,您仍然必须通过调用-init或其他一些初始化方法来初始化新对象,以便超类有机会初始化自己。

于 2012-09-27T19:46:03.590 回答
1

是的,B 类的非继承成员变量将为零。继承变量将具有在类 A 的 init 方法中设置的任何值(如果未设置,则为零)。

于 2012-09-27T19:39:16.827 回答