Introduction
: class type에만 적용되는 개념. class instance가 dealloc 되기 직전에 호출된다.
How Deinitialization Works
: Swift는 ARC를 사용하여 메모리 관리를 하기 때문에 일반적인 경우에는 수동으로 메모리 관리를 할 필요가 없다. 하지만 자신의 resource를 사용하는 경우 수동으로 clean up하는 동작이 필요할 때가 있다. 예를들어, 파일을 열고 쓰는 class를 사용할 경우 class가 dealloc 되는 시점에 해당 파일을 닫는 작업이 실행되어야 한다.
: 직접 deinitializer를 호출하는 것은 허용되지 않는다. super class의 deinitializer는 sub class에서 자동 상속 되고, sub class의 deinitializer 마지막에 super class의 deinitializer가 불린다.
Deinitializers in Action
: 아래 코드를 보며 deinitializer가 어떤 역할을 하는지 살펴 보도록 하자.
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"
'IOS > Swift' 카테고리의 다른 글
[Swift 4.0] Initialization(2) (0) | 2017.04.01 |
---|---|
[Swift 4.0] Initialization(1) (0) | 2017.04.01 |
[Swift 4.0] Inheritance (0) | 2017.04.01 |
[Swift 4.0] Subscripts (0) | 2017.04.01 |
[Swift 4.0] Methods (0) | 2017.04.01 |