본문 바로가기
Smart Device/Swift

Swift Deinitialization

by 언덕너머에 2015. 6. 24.

Deinitialization

Deinitialization은 클래스의 인스턴스가 해제될 때 호출된다. Deinitialization는 Initialization이 init 키워드를 사용하는

것과 마찬가지로 deinit이라는 키워드를 사용한다. 사용 방법도 Initialization과 비슷하지만 Deinitialization은 오직

클래스에서만 사용할 수 있다. 구조체와 열거형에서는 사용할 수 없다.

Swift는 Automatic Reference Counting이라는 기능을 사용하여 인스턴스의 메모리를 관리한다. 따라서 개발자가 코드

안에서 인스턴스 메모리를 관리하는 부분을 작성할 필요가 거의 없다. 그러나 개발자 스스로가 할당한 리소스의 경우라면

아무리 ARC 기능이 뛰어나다고 하더라도 관리할 수가 없다. 대표적으로 파일 오픈이나 네트워크 포트 등이 해당된다.


Deinitialization은 다음의 형식을 갖는다.

  • deinit {
  • // perform the deinitialization
  • }

  • struct Bank {
  • static var coinsInBank = 10_000
  • static func vendCoins(var numberOfCoinsToVend: Int) -> Int {
  • numberOfCoinsToVend = min(numberOfCoinsToVend, coinsInBank)
  • coinsInBank -= numberOfCoinsToVend
  • return numberOfCoinsToVend
  • }
  • static func receiveCoins(coins: Int) {
  • coinsInBank += coins
  • }
  • }

  • class Player {
  • var coinsInPurse: Int
  • init(coins: Int) {
  • coinsInPurse = Bank.vendCoins(coins)
  • }
  • func winCoins(coins: Int) {
  • coinsInPurse += Bank.vendCoins(coins)
  • }
  • deinit {
  • Bank.receiveCoins(coinsInPurse)
  • }
  • }


  • var playerOne: Player? = Player(coins: 100)
  • println("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
  • // prints "A new player has joined the game with 100 coins"
  • println("There are now \(Bank.coinsInBank) coins left in the bank")
  • // prints "There are now 9900 coins left in the bank"

  • playerOne!.winCoins(2_000)
  • println("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
  • // prints "PlayerOne won 2000 coins & now has 2100 coins"
  • println("The bank now only has \(Bank.coinsInBank) coins left")
  • // prints "The bank now only has 7900 coins left"

  • playerOne = nil
  • println("PlayerOne has left the game")
  • // prints "PlayerOne has left the game"
  • println("The bank now has \(Bank.coinsInBank) coins")
  • // prints "The bank now has 10000 coins"