How Deinitialization Works

Swift 는 자동으로 instance 가 더 이상 필요없게 되면 deallocate 해서 resource 를 확보함. Swift 는 ARC (Automatic reference counting) 을 통해 메모리를 관리하기 때문에 개발자가 직접해줘야 하는 건 없음.

단 직접 만든 무언가로 작업할 때는 추가로 필요한 cleanup 을 수행해야 할 필요도 있음.

Class 는 오직 클래스당 하나의 deinitializer 를 갖고 있음. 아무런 parameter 를 받지 않는 형태.

deinit {
	// perform the deinitialization
}

Deinitializer 는 deallocation 이 일어나기 직전에 자동으로 호출되며 직접 개발자가 호출하지 않음.

Superclass deinitializer 는 subclass 에서 상속되고 subclass deinitializer 마지막에 호출됨. Subclass 가 자신의 deinitializer 를 제공하지 않아도 superclass 의 deinitalizer 는 항상 호출됨

Instance 는 deinitializer 가 호출되는 시점에는 deallocated 되지 않은 상태이기 때문에 deinitializer 에서 instance 의 property 에 접근 가능.

Deinitializers in Action

예시

class Bank {
    static var coinsInBank = 10_000
    static func distribute(coins numberOfCoinsRequested: Int) -> Int {
        let numberOfCoinsToVend = min(numberOfCoinsRequested, coinsInBank)
        coinsInBank -= numberOfCoinsToVend
        return numberOfCoinsToVend
    }
    static func receive(coins: Int) {
        coinsInBank += coins
    }
}

class Player {
    var coinsInPurse: Int
    init(coins: Int) {
        coinsInPurse = Bank.distribute(coins: coins)
    }
    func win(coins: Int) {
        coinsInPurse += Bank.distribute(coins: coins)
    }
    
    // Player 가 삭제될 때 가지고 있던 자산을 은행에 넣는 처리
    deinit {
        Bank.receive(coins: coinsInPurse)
    }
}