デイニシャライザ

デイニシャライザはクラスのインスタンスが破棄される時に自動的に呼ばれる特殊なメソッドです。構造体にデイニシャライザはありません。
メモリに確保されたインスタンスやプロパティはARC(Automatic reference counting)によって自動的に破棄されるので通常はデイニシャライザを記述する必要はありませんが、例えばファイルを扱うクラスで、開いたファイルをインスタンスの破棄時に確実に閉じるためにデイニシャライザを利用することができます。

デイニシャライザは次のように、deinitという名のメソッドです。deinitの後の()(かっこ)は不要です。


deinit {
    // 後始末
}

デイニシャライザを明示的に呼び出すことはできません。また、スーバークラスのデイニシャライザも、サブクラスから呼び出す必要はありません。これらはサブクラスでデイニシャライザを定義する、しないに関わらず自動的に呼ばれます。

デイニシャライザの呼び出しが完了するまでインスタンスは破棄されません。なので、デイニシャライザの中でプロパティやselfにアクセスすることも可能です。

次の例では、クライアントクラスのイニシャライザでリソースマネージャから取得したリソースを、デイニシャライザで解放しています。


/* リソースマネージャ */
class ResourceManager {
    // リソースを獲得してリソースIDを返す。
    class func getResource(filePath: String) -> Int {
        var resourceId: Int
        // リソースを獲得する処理
        return resourceId;
    }
    class func releaseResource(resourceId: Int) {
        // リソースを解放する処理
    }
}

/* クライアントクラス */
class Client {
    var resourceId: Int
    // イニシャライザ
    init(filePath: String) {
        resourceId = ResourceManager.getResource(filePath)
    }
    // デイニシャライザ
    deinit {
        ResourceManager.releaseResource(resourceId)
    }
}