【发布时间】:2017-03-11 07:29:43
【问题描述】:
从另一个类创建子类时,需要override init() 函数,但不能覆盖deinit '函数'。
这在 Swift 中可行吗?
这是一个例子
class Foo {
init(){
print("Foo created")
}
deinit {
print("Foo gone")
}
}
class Bar: Foo {
override init(){
print("Bar created")
}
//Is not overwritten here
deinit {
print("Bar gone")
}
}
内部示例视图控制器
override func viewDidLoad() {
super.viewDidLoad()
var f: Foo?
f = Foo()
f = Bar()
f = nil
}
输出
Foo created //Foo object initialised - Foo init() called
Foo created //Foo init() called before calling Bar init()? no call to superclass though..
Bar created //Bar object initialised - Bar init() called
Foo gone //Foo deinit called as Foo instance replaced by Bar instance
Bar gone //Bar deinit called as Bar instance holds no references and is destroyed
Foo gone //Foo deinit called again as part of Bar object destruction?
添加到关于扩展 deinit 的原始问题:
在示例代码中,似乎覆盖init() 会导致调用超类的init() 函数。这是怎么回事?
当Bar 实例被取消初始化时,也会发生同样的行为。这也是这里发生的事情吗?
【问题讨论】:
-
哦哇哦奇怪我没找到这个:/谢谢你的链接!
-
控制台输出正是我所期望的——当 f 的值被 Bar 的实例覆盖时,会发生第一个“Foo 消失”。 Bar 的释放首先调用 Bar 上的 deinit 方法,然后是超类 Foo(超类 deinit 在 deinit 方法结束时自动调用)。
标签: ios swift memory-management swift3 deinit