-
DeinitializationiOS/Swift 공식문서 2022. 2. 21. 20:59
Deinitializer란?
인스턴스의 할당이 해제되기 직전에 호출되는 것으로,
deinit
키워드를 사용하여 정의된다. 클래스 타입에서만 사용할 수 있다.How Deinitialization Works
Swift는 인스턴스가 더이상 필요하지 않다면 할당을 해제한다. 자원 할당을 해제하기 위해서이다. Swift는 인스턴스에 대한 메모리 관리를 automatic reference counting(ARC)를 통해 수행한다. 보통은 manual cleanup을 할 필요가 없지만, 고유한 자원(파일 등)의 경우 직접 할당을 해제해야 하는 경우도 존재한다.
클래스는 최대 한 개의 deinitializer를 가질 수 있다. 매개변수는 필요가 없다. deinitializer는 인스턴스의 할당 해제 직전 자동으로 호출되며, 개발자가 스스로 호출할 수 없다. superclass의 deinitializer는 subclass에 의해 상속되며, subclass의 deinitializer의 끝에서 자동으로 호출된다. subclass에서 deinitializer를 정의하지 않아도 자동으로 호출된다.
deinit { // perform the deinitialization }
Deinitializers in Action
다음 예시를 살펴보자.
Bank
클래스의 경우distribute
메서드를 통해 플레이어에게 돈을 나눠주고, 플레이어가 사라지면receive
메서드로 해당 플레이어가 가지는 돈을 받는다. 은행에는 처음에 10000의 돈을 가지고 있다.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 } }
Player
클래스에서는 deinitializer에서Bank.receive
를 호출하여 은행에게 돈을 넘겨준다.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) } }
우선
playerOne
이 은행에게 100을 받으며 생성된다. 은행에는 9900이 남아있다.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
이 은행에게 2000을 받아서 2100을 갖게 된다. 은행에는 7900이 남게 된다.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
로 인하여playerOne
이 참조하던 인스턴스에 접근할 수 없게 되면, 해당 인스턴스가 할당이 해제된다. 그러면 해당 인스턴스에 deinitializer가 호출되어 은행이 해당Player
인스턴스가 가지고 있던 돈을 받아 다시 10000이 남아있게 된다.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"
Referece
https://docs.swift.org/swift-book/LanguageGuide/Deinitialization.html
'iOS > Swift 공식문서' 카테고리의 다른 글
Error Handling (0) 2022.02.22 Optional Chaining (0) 2022.02.22 Initialization (0) 2022.02.21 Inheritance (0) 2022.02.20 Subscripts (0) 2022.02.19