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

R4j*_*R4j 19 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 ?
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ato 29

您可以选择deinit在子类中包含一个内部.

如果你这样做

    let x = Sub()
Run Code Online (Sandbox Code Playgroud)

你会看到,首先deinit被叫是内部Sub()之后,base deinit被称为.所以是的,super.deinit()被调用但是在子类之后.

这本书也说(第286页):

您不能自己致电deinitializer.超类deinitializers由其子类继承,超类deinitializer在子类deinitializer实现的末尾自动调用.即使子类不提供自己的deinitializer,也始终调用超类deinitializers.

摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/us/jEUH0.l


Nat*_*ook 6

超类deinitializers由其子类继承,超类deinitializer在子类deinitializer实现的末尾自动调用.即使子类不提供自己的deinitializer,也始终调用超类deinitializers.

摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itun.es/us/jEUH0.l