可以在Swift中覆盖deinit吗?

Dan*_*ram 2 memory-management ios swift deinit swift3

从另一个类创建子类时,overrideinit()函数需要它,但您不能覆盖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")
    }
}
Run Code Online (Sandbox Code Playgroud)

里面的示例viewcontroller

override func viewDidLoad() {
    super.viewDidLoad()

    var f: Foo?
    f = Foo()
    f = Bar()
    f = nil

}
Run Code Online (Sandbox Code Playgroud)

产量

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?
Run Code Online (Sandbox Code Playgroud)

要添加到我关于扩展的原始问题deinit:

在示例代码中,覆盖似乎init()会导致调用init()超类的函数.这是发生了什么?

Bar实例取消初始化时会发生相同的行为.这也是这里发生的事情吗?

Sul*_*han 8

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

在实例解除分配之前,会自动调用取消初始化程序.您不能自己致电deinitializer.超类deinitializers由其子类继承,超类deinitializer在子类deinitializer实现的末尾自动调用.即使子类不提供自己的deinitializer,也始终调用超类deinitializers.

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

为什么它不同init?在初始化程序中,您需要传递参数,还需要控制执行顺序(之前的super.init(...)某些代码,之后的某些代码super.init(...)).取消初始化是一个具有已定义执行顺序的自动过程.覆盖只会引入不必要的问题.