从另一个类创建子类时,需要override
init()
函数,但不能覆盖deinit
的“函数”。是否可以重写Swift中的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
实例取消初始化时会发生相同的行为。这也是这里发生的事情吗?
相关:[了解deinitialization和继承在swift语言](http://stackoverflow.com/questions/24019652/understand-deinitialization-and-inheritance-in-swift-language)。 –
哦哇奇怪我没有找到这个:/谢谢你的链接! – Danoram
控制台输出正是我所期望的 - 当f的值被Bar实例覆盖时,第一个“Foo消失”发生。 Bar的取消分配首先在Bar上调用deinit方法,然后是超类Foo(超类deinit在deinit方法结束时自动调用)。 –