別のクラスからサブクラスを作成するときは、init()
関数をoverride
にする必要がありますが、deinit
関数をオーバーライドすることはできません。Swiftでdeinitを上書きすることはできますか?
これはSwiftでも可能ですか?ここで
は私の元の質問aに追加するには
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?
のViewController例の中に
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")
}
}
例ですdeinit
を拡張試合:
をコード例では、init()
をオーバーライドするスーパークラスのinit()
関数への呼び出しが発生しているようです。これは何が起こっているのですか?
Bar
インスタンスが初期化されていない場合と同じ現象が発生します。これもまたここで起こっているのでしょうか?
関連:[初期化と継承を迅速に理解する](http://stackoverflow.com/questions/24019652/understand-deinitialization-and-inheritance-in-swift-language) –
ああ、私はこれを見つけられませんでした奇妙な:/リンクありがとう! – Danoram
コンソール出力はまさに私が期待していたものです。最初の "Foo gone"は、fの値がBarのインスタンスによって上書きされたときに発生します。 Barの割り当てを解除すると、最初にBarのdeinitメソッドが呼び出されます。それから、スーパークラスFooです(スーパークラスdeinitは、deinitメソッドの最後に自動的に呼び出されます)。 –