ios - 是否可以在 Swift 中覆盖 deinit?

标签 ios swift memory-management swift3 deinit

<分区>

当从另一个类创建子类时,需要覆盖 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")
    }
}

内部示例 View Controller

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() 似乎会导致调用父类(super class)的 init() 函数。这就是正在发生的事情吗?

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

最佳答案

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

Deinitializers are called automatically, just before instance deallocation takes place. You are not allowed to call a deinitializer yourself. Superclass deinitializers are inherited by their subclasses, and the superclass deinitializer is called automatically at the end of a subclass deinitializer implementation. Superclass deinitializers are always called, even if a subclass does not provide its own deinitializer.

绝对没有理由改变父类(super class)在其 deinit 中所做的任何事情。

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

关于ios - 是否可以在 Swift 中覆盖 deinit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40304505/

相关文章:

ios - Swift 将自定义注释转换为 MKAnnotation

ios - 从 reverseGeocodeLocation 仅返回英文地址

swift - AWS API Gateway 生成的 iOS SDK 缺少必需的 'defaultClient' 成员

iphone - IB 与以编程方式创建 UIButtons

python - pympler 引发 TypeError

ios - CKQuery操作错误: This operation has been rate limited

objective-c - 仅在纵向模式下伪造横向 View

ios - 0到1之间的swift随机双数

ios - swift: nsurlsession 下载文件

c++ - HDC内存泄漏(释放HDC/删除hdc)