在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ iOS/ 析構(gòu)過程
特性(Attributes)
Access Control 權(quán)限控制的黑與白
基本運算符(Basic Operators)
基礎(chǔ)部分(The Basics)
閉包(Closures)
擴展
泛型參數(shù)(Generic Parameters and Arguments)
訪問控制和 protected
語句(Statements)
模式(Patterns)
WWDC 里面的那個“大炮打氣球”
關(guān)于語言參考(About the Language Reference)
語法總結(jié)(Summary of the Grammar)
嵌套類型
類型(Types)
Swift 初見(A Swift Tour)
泛型
枚舉(Enumerations)
高級運算符
繼承
析構(gòu)過程
關(guān)于 Swift(About Swift)
訪問控制
類和結(jié)構(gòu)體
內(nèi)存安全
Swift 與 C 語言指針友好合作
協(xié)議
屬性(Properties)
可選類型完美解決占位問題
錯誤處理
字符串和字符(Strings and Characters)
聲明(Declarations)
自動引用計數(shù)
Swift 里的值類型與引用類型
表達(dá)式(Expressions)
Swift 文檔修訂歷史
造個類型不是夢-白話 Swift 類型創(chuàng)建
歡迎使用 Swift
詞法結(jié)構(gòu)(Lexical Structure)
集合類型(Collection Types)
下標(biāo)
方法(Methods)
可選鏈?zhǔn)秸{(diào)用
版本兼容性
類型轉(zhuǎn)換
構(gòu)造過程
The Swift Programming Language 中文版
函數(shù)(Functions)
Swift 教程
控制流(Control Flow)

析構(gòu)過程


1.0 翻譯:bruce0505 校對:fd5788

2.0 翻譯+校對:chenmingbiao

2.1 校對:shanks,2015-10-31

2.2 翻譯+校對:SketchK 2016-05-14

3.0.1,shanks,2016-11-13

4.0 校對:kemchenj 2017-09-21

4.1 翻譯+校對:mylittleswift

本頁包含內(nèi)容:

析構(gòu)器只適用于類類型,當(dāng)一個類的實例被釋放之前,析構(gòu)器會被立即調(diào)用。析構(gòu)器用關(guān)鍵字 deinit 來標(biāo)示,類似于構(gòu)造器要用 init 來標(biāo)示。

析構(gòu)過程原理

Swift 會自動釋放不再需要的實例以釋放資源。如自動引用計數(shù)章節(jié)中所講述,Swift 通過自動引用計數(shù)(ARC) 處理實例的內(nèi)存管理。通常當(dāng)你的實例被釋放時不需要手動地去清理。但是,當(dāng)使用自己的資源時,你可能需要進(jìn)行一些額外的清理。例如,如果創(chuàng)建了一個自定義的類來打開一個文件,并寫入一些數(shù)據(jù),你可能需要在類實例被釋放之前手動去關(guān)閉該文件。

在類的定義中,每個類最多只能有一個析構(gòu)器,而且析構(gòu)器不帶任何參數(shù),如下所示:

deinit {
    // 執(zhí)行析構(gòu)過程
}

析構(gòu)器是在實例釋放發(fā)生前被自動調(diào)用。你不能主動調(diào)用析構(gòu)器。子類繼承了父類的析構(gòu)器,并且在子類析構(gòu)器實現(xiàn)的最后,父類的析構(gòu)器會被自動調(diào)用。即使子類沒有提供自己的析構(gòu)器,父類的析構(gòu)器也同樣會被調(diào)用。

因為直到實例的析構(gòu)器被調(diào)用后,實例才會被釋放,所以析構(gòu)器可以訪問實例的所有屬性,并且可以根據(jù)那些屬性可以修改它的行為(比如查找一個需要被關(guān)閉的文件)。

析構(gòu)器實踐

這是一個析構(gòu)器實踐的例子。這個例子描述了一個簡單的游戲,這里定義了兩種新類型,分別是 BankPlayerBank 類管理一種虛擬硬幣,確保流通的硬幣數(shù)量永遠(yuǎn)不可能超過 10,000。在游戲中有且只能有一個 Bank 存在,因此 Bank 用類來實現(xiàn),并使用類型屬性和類型方法來存儲和管理其當(dāng)前狀態(tà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
    }
}

Bank 使用 coinsInBank 屬性來跟蹤它當(dāng)前擁有的硬幣數(shù)量。Bank 還提供了兩個方法,distribute(coins:)receive(coins:),分別用來處理硬幣的分發(fā)和收集。

distribute(coins:) 方法在 Bank 對象分發(fā)硬幣之前檢查是否有足夠的硬幣。如果硬幣不足,Bank 對象會返回一個比請求時小的數(shù)字(如果 Bank 對象中沒有硬幣了就返回 0)。此方法返回一個整型值,表示提供的硬幣的實際數(shù)量。

receive(coins:) 方法只是將 Bank 實例接收到的硬幣數(shù)目加回硬幣存儲中。

Player 類描述了游戲中的一個玩家。每一個玩家在任意時間都有一定數(shù)量的硬幣存儲在他們的錢包中。這通過玩家的 coinsInPurse 屬性來表示:

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)
    }
}

每個 Player 實例在初始化的過程中,都從 Bank 對象獲取指定數(shù)量的硬幣。如果沒有足夠的硬幣可用,Player 實例可能會收到比指定數(shù)量少的硬幣。

Player 類定義了一個 win(coins:) 方法,該方法從 Bank 對象獲取一定數(shù)量的硬幣,并把它們添加到玩家的錢包。Player 類還實現(xiàn)了一個析構(gòu)器,這個析構(gòu)器在 Player 實例釋放前被調(diào)用。在這里,析構(gòu)器的作用只是將玩家的所有硬幣都返還給 Bank 對象:

var playerOne: Player? = Player(coins: 100)
print("A new player has joined the game with \(playerOne!.coinsInPurse) coins")
// 打印 "A new player has joined the game with 100 coins"
print("There are now \(Bank.coinsInBank) coins left in the bank")
// 打印 "There are now 9900 coins left in the bank"

創(chuàng)建一個 Player 實例的時候,會向 Bank 對象請求 100 個硬幣,如果有足夠的硬幣可用的話。這個 Player 實例存儲在一個名為 playerOne 的可選類型的變量中。這里使用了一個可選類型的變量,因為玩家可以隨時離開游戲,設(shè)置為可選使你可以追蹤玩家當(dāng)前是否在游戲中。

因為 playerOne 是可選的,所以訪問其 coinsInPurse 屬性來打印錢包中的硬幣數(shù)量時,使用感嘆號(!)強制解包:

playerOne!.win(coins: 2_000)
print("PlayerOne won 2000 coins & now has \(playerOne!.coinsInPurse) coins")
// 輸出 "PlayerOne won 2000 coins & now has 2100 coins"
print("The bank now only has \(Bank.coinsInBank) coins left")
// 輸出 "The bank now only has 7900 coins left"

這里,玩家已經(jīng)贏得了 2,000 枚硬幣,所以玩家的錢包中現(xiàn)在有 2,100 枚硬幣,而 Bank 對象只剩余 7,900 枚硬幣。

playerOne = nil
print("PlayerOne has left the game")
// 打印 "PlayerOne has left the game"
print("The bank now has \(Bank.coinsInBank) coins")
// 打印 "The bank now has 10000 coins"

玩家現(xiàn)在已經(jīng)離開了游戲。這通過將可選類型的 playerOne 變量設(shè)置為 nil 來表示,意味著“沒有 Player 實例”。當(dāng)這一切發(fā)生時,playerOne 變量對 Player 實例的引用被破壞了。沒有其它屬性或者變量引用 Player 實例,因此該實例會被釋放,以便回收內(nèi)存。在這之前,該實例的析構(gòu)器被自動調(diào)用,玩家的硬幣被返還給銀行。