5

从另一个类创建子类时,函数需要它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")
    }
}

内部示例视图控制器

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实例被取消初始化时,也会发生同样的行为。这也是这里发生的事情吗?

4

1 回答 1

9

deinit不是一个普通的方法,它不能被覆盖。每个实例都有一个独立 deinit的处理程序来处理它的类和它的所有超类。

就在实例释放之前,会自动调用反初始化器。您不能自己调用​​反初始化器。超类反初始化器由其子类继承,超类反初始化器在子类反初始化器实现结束时自动调用。总是调用超类的反初始化器,即使子类不提供自己的反初始化器。

绝对没有理由改变超类在其deinit.

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

于 2016-10-28T11:58:46.490 回答