从另一个类创建子类时,需要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(...)
之后)。取消初始化是一个具有已定义的执行顺序的自动过程。重写只会带来不必要的问题。