【问题标题】:Is it possible to override deinit in Swift? [duplicate]是否可以在 Swift 中覆盖 deinit? [复制]
【发布时间】: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


【解决方案1】:

deinit 不是普通方法,不能被覆盖。每个实例都有一个独立 deinit 处理程序,用于其类及其所有超类。

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

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

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

【讨论】:

  • 这意味着我的整个源代码中不应该有任何关键字deinit,对吧?
  • @SazzadHissainKhanq 不正确。但是,你不能仅仅从超类deinit 是从一个子类做的。
  • 我一直在添加 deinit 进行调试(主要在我的视图控制器上)。在其中,我通常只是将消息记录到控制台、设置断点等,以了解“何时”释放某些东西(帮助我跟踪保留周期)。但至于最终产品中需要的“真实”代码,我还不需要 deinit。
猜你喜欢
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
相关资源
最近更新 更多