假设我有两个类:基类和子类,如下所示:
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 ?
}
}
调用子类的析构函数时,是否调用super.deinit()
将nil赋值给name
变量?或者我必须在子类的析构器中手动赋值?
最佳答案
您可以选择在您的子类中有一个deinit
。
如果你这样做
let x = Sub()
你会看到首先调用的 deinit
是 Sub()
中的那个,然后是 base
deinit
被调用。所以是的,super.deinit()
被调用但是在子类之后。
书中还说(第 286 页):
You are not allowed to call a deinitializer yourself. Superclass deinitializers are inherited by their subclasses, and the superclass deinitializer is called automatically at the end of a subclass deinitializer implementation. Superclass deinitializers are always called, even if a subclass does not provide its own deinitializer.
摘自:Apple Inc.“The Swift Programming Language”。电子书。 https://itun.es/us/jEUH0.l
关于inheritance - 理解swift语言中的去初始化和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24019652/