c++中谣殊,如果沒有定義析構(gòu)函數(shù),c++會提供一個默認析構(gòu)函數(shù)紊馏;由于swift采用自動引用計數(shù)來進行內(nèi)存管理料饥,不需要程序員手動釋放內(nèi)存,因此swift不提供默認析構(gòu)器朱监。但是岸啡,當需要進行一些額外的清理,例如類實例打開了一個文件赫编,需要關(guān)閉文件巡蘸。
析構(gòu)器的語法如下:
deinit {
? ? // 執(zhí)行析構(gòu)過程
}
析構(gòu)器在實例釋放前被自動調(diào)用奋隶,不能主動調(diào)用析構(gòu)器,這點與c++相同悦荒。一個類最多有一個析構(gòu)器唯欣,c++是有且只有一個析構(gòu)函數(shù)。
Swift子類繼承了父類的析構(gòu)器搬味,并且在子類析構(gòu)器實現(xiàn)的最后境氢,父類的析構(gòu)器會被自動調(diào)用。即使子類沒有提供自己的析構(gòu)器碰纬,父類的析構(gòu)器也同樣會被調(diào)用产还。
class Bank {
? ? static var coinsInBank = 10000
? ? 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(playerOne!.coinsInPurse)
print("There are now \(Bank.coinsInBank) coins left in Bank")
playerOne!.win(coins: 4000)
print("There are now \(Bank.coinsInBank) coins left in Bank")
playerOne = nil
print("There are now \(Bank.coinsInBank) coins left in Bank")