Search

[Swift 공식 문서] 15. Deinitialization

deinitialier(소멸자) 는 클래스의 인스턴스가 할당이 해제되기 직전에 호출됩니다.
deinit 키워드로 작성할 수 있으며 class 타입에서만 사용이 가능합니다.

How Deinitialization Works

Swift 는 인스턴스가 더이상 필요하지 않은 경우 자동으로 할당을 해제합니다.
Swift 는 ARC(Automatic Reference Counting) 을 통해 메모리 관리를 수행합니다.
인스턴스가 할당이 해제 되었을 때 수동으로 cleanup 동작을 수행할 필요가 없습니다.
하지만, 자체 리소스를 사용하는 경우엔 몇가지 추가적인 정리를 직접해야할 수 있다.
예를 들어 커스텀 클래스를 만들어 파일을 열고 일부 데이터를 사용하는 경우 클래스 인스턴스가 할당 해제되기 전에 파일을 닫아야 한다.
클래스는 최대 한 개의 소멸자 가질 수 있다.
deinit { // perform the deinitialization }
Swift
복사
인스턴스의 할당이 해제될 때, 소멸자는 자동으로 호출되며,
소멸자를 직접 호출할 수 없다.
상위 클래스의 소멸자는 하위 클래스로 상속된다. 그리고 상위 클래스의 소멸자는 하위 클래스의 소멸자 구현의 마지막 부분에서 자동으로 호출된다.
하위 클래스에 소멸자가 없어도 상위클래스의 소멸자는 항상 호출된다.
소멸자가 호출된 이후에 인스턴스의 할당이 해제되므로
소멸자는 모든 프로퍼티에 접근이 가능하다.

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) } deinit { Bank.receive(coins: coinsInPurse) } } var playerOne: Player? = Player(coins: 100) print("A new player has joined the game with \(playerOne!.coinsInPurse) coins") // Prints "A new player has joined the game with 100 coins" print("There are now \(Bank.coinsInBank) coins left in the bank") // Prints "There are now 9900 coins left in the bank" playerOne!.win(coins: 2_000) print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins") // Prints "PlayerOne won 2000 coins & now has 2100 coins" print("The bank now only has \(Bank.coinsInBank) coins left") // Prints "The bank now only has 7900 coins left" playerOne = nil print("PlayerOne has left the game") // Prints "PlayerOne has left the game" print("The bank now has \(Bank.coinsInBank) coins") // Prints "The bank now has 10000 coins"
Swift
복사
playerOne 변수의 Player 인스턴스로의 참조 관계가 깨짐으로써, 할당이 해제되었다.
따라서 deinitializer 가 호출된다.