天天看點

Swift學習筆記(十三)析構過程

析構過程

在一個類的執行個體被釋放之前,析構函數被立即調用。用關鍵字deinit來标示析構函數,類似于初始化函數用init來标示。析構函數隻适用于類類型。

析構過程原理

Swift 會自動釋放不再需要的執行個體以釋放資源Swift 通過自動引用計數(ARC)處理執行個體的記憶體管理

示例

deinit {
    // 執行析構過程
}
           

析構函數是在執行個體釋放發生前一步被自動調用。不允許主動調用自己的析構函數。子類繼承了父類的析構函數,并且在子類析構函數實作的最後,父類的析構函數被自動調用。即使子類沒有提供自己的析構函數,父類的析構函數也總是被調用。

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 {//Player執行個體被銷毀時調用
        Bank.receiveCoins(coinsInPurse)
    }
}
var playerOne: Player? = Player(coins: 100)
println("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
// 輸出 "A new player has joined the game with 100     coins"
println("There are now \(Bank.coinsInBank) coins left in the bank")
// 輸出 "There are now 9900 coins left in the bank"
playerOne!.winCoins(2_000)
println("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// 輸出 "PlayerOne won 2000 coins & now has 2100 coins"
println("The bank now only has \(Bank.coinsInBank) coins left")
// 輸出 "The bank now only has 7900 coins left"
playerOne = nil  //置為nil時析構函數被調用
println("PlayerOne has left the game")
// 輸出 "PlayerOne has left the game"
println("The bank now has \(Bank.coinsInBank) coins")
// 輸出 "The bank now has 10000 coins"