A deinitializer is called immediately before a class instance is deallocated.

Write with deinit keyword.

Swift manage the instance memory through automatic reference counting.

Deinitializer can access all properties of the instance, and do some work to release the handlers (such as close a file).

Class definition can have at most one deinitializer per class. It doesn’t take any parameters.

// The function creat a cat and the cat will destory after the function end.
class Cat {
    init () {
        print("Create")
    }
    deinit {
        print("Destory")
    }
}
func run() {
    var cat = Cat()
}

run()

// Print:
// Create
// Destory

Deinitializers in Action

Here shows a static Bank that own some coins. When create a new player, the player get coins from the Bank. And the player give back the coins to the Bank before the player is deinitialized.

class Bank {
    static var coins = 10000
    static func distribute(coinsRequest: Int) -> Int {
        let num = min(coinsRequest, coins) // It can only get at most 'coins' count.
        coins -= num
        return num
    }
    static func recive(num: Int) {
        coins += num
    }
}

class Player {
    var coins: Int
    init(coins: Int) {
        self.coins = coins
        Bank.distribute(coinsRequest: coins)
    }
    func win(coins: Int) {
        self.coins += Bank.distribute(coinsRequest: coins)
    }
    deinit {
        Bank.recive(num: coins)
    }
}
func create() {
    var mike = Player(coins: 300)
    print("After init \(Bank.coins)")
    mike.win(coins: 200)
    print("After win \(Bank.coins)")
}

create()
print("After deinit \(Bank.coins)")

// Print: 
// After init 9700
// 9500
// 10000