2016-10-28 5 views
2

別のクラスからサブクラスを作成するときは、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インスタンスが初期化されていない場合と同じ現象が発生します。これもまたここで起こっているのでしょうか?

+5

関連:[初期化と継承を迅速に理解する](http://stackoverflow.com/questions/24019652/understand-deinitialization-and-inheritance-in-swift-language) –

+0

ああ、私はこれを見つけられませんでした奇妙な:/リンクありがとう! – Danoram

+0

コンソール出力はまさに私が期待していたものです。最初の "Foo gone"は、fの値がBarのインスタンスによって上書きされたときに発生します。 Barの割り当てを解除すると、最初にBarのdeinitメソッドが呼び出されます。それから、スーパークラスFooです(スーパークラスdeinitは、deinitメソッドの最後に自動的に呼び出されます)。 –

答えて

6

deinitは、通常の方法ではありませんが、上書きすることはできません。すべてのインスタンスには、そのクラスとそのすべてのスーパークラスのための独立したdeinitハンドラがあります。

デイニタライザは、インスタンスの割り当てが解除される直前に自動的に呼び出されます。あなたは自分自身でdeinitializerを呼び出すことはできません。スーパークラスdeinitializerはサブクラスによって継承され、スーパークラスdeinitializerはサブクラスdeinitializerの実装の終わりに自動的に呼び出されます。スーパークラス初期化子は、サブクラスが独自の非初期化子を提供しない場合でも常に呼び出されます。

スーパークラスが行っていることを絶対に変更する必要はありません。deinit

なぜinitと異なるのですか?あなたがパラメータを渡す必要があるイニシャライザでは、実行の順序を制御する必要があります(super.init(...)の前のコード、super.init(...)の後のコード)。初期化解除は、定義された順序で実行される自動プロセスです。オーバーライドすると、不必要な問題が発生する可能性があります。

関連する問題