ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Deinitialization
    iOS/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

    댓글

Designed by Tistory.