【问题标题】:Understand deinitialization and inheritance in swift language用swift语言理解去初始化和继承
【发布时间】:2014-06-03 15:56:10
【问题描述】:

假设我有两个类:基类和子类,如下所示:

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?或者我必须在子类的反初始化器中手动分配?

【问题讨论】:

    标签: inheritance swift


    【解决方案1】:

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

    如果你这样做

        let x = Sub()
    

    您会看到,首先调用的 deinitSub() 内部的那个,然后调用 base deinit。所以是的,super.deinit() 是在子类之后调用的。

    书中还说(第 286 页):

    您不能自己调用​​反初始化器。超类的反初始化器由它们的子类继承,而超类 deinitializer 在子类结束时自动调用 去初始化器实现。超类反初始化器总是 调用,即使子类不提供自己的反初始化器。

    摘自:Apple Inc. “Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

    【讨论】:

      【解决方案2】:

      超类的反初始化器被它们的子类继承,并且 超类反初始化器在结束时自动调用 子类反初始化器实现。超类反初始化器是 总是被调用,即使子类不提供自己的 去初始化器。

      摘自:Apple Inc.“Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多