Swiftのdeinitについて

2016年8月31日(更新: 2016年8月31日)

Swiftの公式ドキュメントより、deinit(Deinitialization)について要点をまとめました。

deinitの要点

  • クラスのインスタンスが解放される直前に自動的に呼ばれる
  • 任意のタイミングで呼び出すことはできない
  • クラスでしか使えない。1つのクラスにつき1つのdeinitが定義できる
  • 基本的にメモリ解放にはARCが働くので使う機会は少ない
  • 自前のリソースを使っている場合、その解放のために使うことができる(例: 書き込みのために開いたファイルなど)

deinitの書き方

deinit {
    // ここに解放処理などを書く
    // まだインスタンスは解放されていないので、クラス内のすべての変数などにアクセスできる
}

deinitの使用例

公式ドキュメントの例では、ゲームのプレイヤーのインスタンスが破棄される時、所持しているお金を返すという用途で使用されています。

class Player {

	// プレイヤーの所持金
    var coinsInPurse: Int
    
    init(coins: Int) {
        coinsInPurse = Bank.vendCoins(coins)
    }
    func winCoins(coins: Int) {
        coinsInPurse += Bank.vendCoins(coins)
    }
    deinit {
    	// 破棄される前に銀行に所持金をすべて返す
        Bank.receiveCoins(coinsInPurse)
    }
}

また、SwiftでKVOKey-Value Observing)を行うとき、その observer を除去する際に deinit を使うことが推奨されています。

Using Swift with Cocoa and Objective-C (Swift 2.2): Adopting Cocoa Design Patterns

Swiftのdeinitについて」への1件のフィードバック

  1. ピンバック: [Swift3.0] NotificationCenter を使ってアプリの状態に応じた処理を行う | JoyPlotドキュメント

コメントを残す

メールアドレスが公開されることはありません。