2014-09-02 51 views
11

我正在Swift中构建一个iOS应用程序,并在Apple提供的Lister示例项目上绘图。在Swift的NSObject子类的初始化程序中调用super.init()

Lister使用两个模型对象:List和ListItem。我发现他们都不会在初始化器中调用super.init(),即使它们是NSObject的子类。

但是,在Lister的Objective-C版本中,两个模型对象(AAPLList和AAPLListItem)都会调用[super init]

雨燕编程语言明确规定,“指定的初始化程序必须调用从他们的直接超类的指定初始化方法。”(在初始化初始化程序链接的规则1)

这是怎么回事?为什么这是一个例外,如果你不应该总是在子类中调用super.init(),什么规则适用?

回答

12

即使我在文档中找不到描述这个位置的地方,会发生什么情况是,在子类初始化程序的末尾调用默认超类初始化程序(如果这是超类的唯一初始化程序)没有被明确地调用。

NSObject只有初始化器(init());默认你可以看到试图引用自(如println(self))在不调用super.init():一个构造函数,超初始化器被称为在子类初始化器的你到底是不允许做因为该类没有在这一点上完全初始化。

如果你想在构造函数中的某处使用自我,对象需要在这一点上完全建立,所以你需要在那之前手动调用super.init()

相关问题