用快速语言理解去初始化和继承

时间:2014-06-03 15:56:11

标签: inheritance swift

我们说我有两个类:基类和子类,如下所示:

class Base{
    var name: String?
    init() {
       name = "The base class"
    }

    deinit {
       println("call Deinitialization in base class")
       name = nil
    }
}

class Sub: Base{
    var subName: String?
    init() {
     super.init()
     subName = "The sub class"
    }

    deinit {
       println("call Deinitialization in sub class")
       subName = nil
       // does it really call super.deinit() ?
       // or assign name = nil ?
    }
}

当调用子类的deinitializer时,是否会调用super.deinit()name变量赋给nil?或者我必须在子类的deinitializer中手动分配?

2 个答案:

答案 0 :(得分:29)

您可以选择在子类中包含deinit

如果你这样做

    let x = Sub()

您会看到,首先调用的deinitSub()内的base,然后调用deinit super.deinit()。所以是{{1}}被调用但是在子类之后。

这本书也说(第286页):

  

您不能自己致电deinitializer。超类deinitializers由它们的子类和超类继承   deinitializer在子类的末尾自动调用   deinitializer实现。超级的deinitializers总是如此   即使子类没有提供自己的deinitializer,也会调用它。

摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/us/jEUH0.l

答案 1 :(得分:6)

  

超类deinitializers由它们的子类继承,并且   超类deinitializer在a结束时自动调用   子类deinitializer实现。超级的deinitializers是   总是被调用,即使子类不提供它自己的   deinitializer。

摘自:Apple Inc.“The Swift Programming Language。”iBooks。 https://itun.es/us/jEUH0.l