2016-10-28 146 views
2

从另一个类创建子类时,需要overrideinit()函数,但不能覆盖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实例取消初始化时会发生相同的行为。这也是这里发生的事情吗?

+5

相关:[了解deinitialization和继承在swift语言](http://stackoverflow.com/questions/24019652/understand-deinitialization-and-inheritance-in-swift-language)。 –

+0

哦哇奇怪我没有找到这个:/谢谢你的链接! – Danoram

+0

控制台输出正是我所期望的 - 当f的值被Bar实例覆盖时,第一个“Foo消失”发生。 Bar的取消分配首先在Bar上调用deinit方法,然后是超类Foo(超类deinit在deinit方法结束时自动调用)。 –

回答

6

deinit是不正常的方法,它不能被覆盖。每个实例都有一个独立的deinit它的类及其所有超类的处理程序。

在实例释放发生之前,会自动调用取消初始化程序。你不能自己打电话给一个deinitializer。超类取消初始化程序由它们的子类继承,超类取消初始化程序在子类取消初始化程序实现的末尾自动调用。即使子类不提供它自己的去初始化器,也会始终调用超类去初始化器。

绝对没有理由改变超类在其deinit中做的任何事情。

为什么它不同于init?在初始化器中需要传递参数,还需要控制执行顺序(在super.init(...)之前的一些代码,在super.init(...)之后的某些代码)。去初始化是一个具有确定执行顺序的自动过程。重写只能引入不必要的问题。

相关问题