反初始化 (Deinitialization)
自從蘋(píng)果2014年發(fā)布Swift草姻,到現(xiàn)在已經(jīng)兩年多了共耍,而Swift也來(lái)到了3.1版本掖举。去年利用工作之余濒旦,共花了兩個(gè)多月的時(shí)間把官方的Swift編程指南看完。現(xiàn)在整理一下筆記炫贤,回顧一下以前的知識(shí)溅固。有需要的同學(xué)可以去看官方文檔>>。
反初始化器在一個(gè)類(lèi)的實(shí)例被釋放之前調(diào)用兰珍。反初始化器只適用于class類(lèi)型侍郭。
反初始化器如果工作 (How Deinitialization Works)
當(dāng)一個(gè)類(lèi)的實(shí)例不再需要的時(shí)候,Swift會(huì)自動(dòng)釋放。Swift是通過(guò)自動(dòng)引用計(jì)數(shù)(automatic reference counting亮元,簡(jiǎn)稱(chēng)ARC)來(lái)管理內(nèi)存的猛计,不需要手動(dòng)管理。然后爆捞,在默寫(xiě)情況下是需要自己去釋放資源的奉瘤。例如,如果我們創(chuàng)建了一個(gè)自定義的類(lèi)去打開(kāi)一個(gè)文件或者把數(shù)據(jù)寫(xiě)入到文件嵌削,我們必須在這個(gè)類(lèi)的實(shí)例被釋放之前手動(dòng)關(guān)閉文件毛好。
每個(gè)類(lèi)最多只有一個(gè)反初始化器:
deinit {
// perform the deinitialization
}
反初始化器在一個(gè)類(lèi)的實(shí)例被釋放之前調(diào)用,我們不能自己調(diào)用反初始化器苛秕。父類(lèi)的反初始化器會(huì)被子類(lèi)繼承肌访,并且父類(lèi)的反初始化器會(huì)在子類(lèi)反初始化器的實(shí)現(xiàn)后面被調(diào)用。即使子類(lèi)沒(méi)有提供自己的反初始化器艇劫,父類(lèi)的反初始化器也會(huì)被調(diào)用吼驶。
因?yàn)樵诜闯跏蓟鞅徽{(diào)用之前,實(shí)例還沒(méi)有被釋放店煞,所以在反初始化器里面可以訪問(wèn)所有實(shí)例屬性蟹演,并用這些屬性來(lái)執(zhí)行一些相關(guān)的代碼。
反初始化器實(shí)踐 (Deinitializers in Action)
創(chuàng)建Bank
和Player
兩個(gè)類(lèi):
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)
}
}
創(chuàng)建一個(gè)Player
實(shí)例:
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"
執(zhí)行winCoins(_:)
方法:
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
設(shè)置為nil顷蟀,意味著playerOne
不再引用Player
實(shí)例酒请,那么反初始化器被調(diào)用,receive(coins:)
方法被執(zhí)行鸣个,玩家所有的游戲幣返回給銀行羞反。
第十五部分完。下個(gè)部分:【Swift 3.1】16 - 自動(dòng)引用計(jì)數(shù) (Automatic Reference Counting)
如果有錯(cuò)誤的地方囤萤,歡迎指正昼窗!謝謝!