在Swift中是否可以重写deinit ?



从另一个类创建子类时,需要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实例被去初始化时也会发生相同的行为。这也是这里正在发生的吗?

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

在实例释放之前自动调用反初始化器。你不允许自己调用初始化器。超类取消初始化器由它们的子类继承,超类取消初始化器在子类取消初始化器实现结束时自动调用。父类的取消初始化器总是被调用,即使子类没有提供自己的取消初始化器。

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

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

相关内容

  • 没有找到相关文章

最新更新