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

鍍金池/ 教程/ iOS/ 析構(gòu)過程(Deinitialization)
方法 - Methods
關(guān)于 Swift
下標腳本(Subscripts)
類和結(jié)構(gòu)體
類型轉(zhuǎn)換(Type Casting)
控制流
析構(gòu)過程(Deinitialization)
集合類型 (Collection Types)
構(gòu)造過程(Initialization)
Optional Chaining
枚舉(Enumerations)
自動引用計數(shù)
繼承(Inheritance)
擴展(Extensions)
泛型
字符串和字符(Strings and Characters)
函數(shù)(Functions)
高級運算符
訪問控制
基本運算符
嵌套類型
閉包(Closures)
協(xié)議
屬性 (Properties)

析構(gòu)過程(Deinitialization)

在一個類的實例被釋放之前,析構(gòu)函數(shù)被立即調(diào)用。用關(guān)鍵字deinit來標示析構(gòu)函數(shù),類似于初始化函數(shù)用init來標示。析構(gòu)函數(shù)只適用于類類型。

析構(gòu)過程原理

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

在類的定義中,每個類最多只能有一個析構(gòu)函數(shù)。析構(gòu)函數(shù)不帶任何參數(shù),在寫法上不帶括號:

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

析構(gòu)函數(shù)是在實例釋放發(fā)生前一步被自動調(diào)用。不允許主動調(diào)用自己的析構(gòu)函數(shù)。子類繼承了父類的析構(gòu)函數(shù),并且在子類析構(gòu)函數(shù)實現(xiàn)的最后,父類的析構(gòu)函數(shù)被自動調(diào)用。即使子類沒有提供自己的析構(gòu)函數(shù),父類的析構(gòu)函數(shù)也總是被調(diào)用。

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

析構(gòu)函數(shù)操作

這里是一個析構(gòu)函數(shù)操作的例子。這個例子是一個簡單的游戲,定義了兩種新類型,BankPlayer。Bank結(jié)構(gòu)體管理一個虛擬貨幣的流通,在這個流通中Bank永遠不可能擁有超過 10,000 的硬幣。在這個游戲中有且只能有一個Bank存在,因此Bank由帶有靜態(tài)屬性和靜態(tài)方法的結(jié)構(gòu)體實現(xiàn),從而存儲和管理其當前的狀態(tài)。

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

Bank根據(jù)它的coinsInBank屬性來跟蹤當前它擁有的硬幣數(shù)量。銀行還提供兩個方法——vendCoinsreceiveCoins——用來處理硬幣的分發(fā)和收集。

vendCoins方法在 bank 分發(fā)硬幣之前檢查是否有足夠的硬幣。如果沒有足夠多的硬幣,Bank返回一個比請求時小的數(shù)字(如果沒有硬幣留在 bank 中就返回 0)。vendCoins方法聲明numberOfCoinsToVend為一個變量參數(shù),這樣就可以在方法體的內(nèi)部修改數(shù)字,而不需要定義一個新的變量。vendCoins方法返回一個整型值,表明了提供的硬幣的實際數(shù)目。

receiveCoins方法只是將 bank 的硬幣存儲和接收到的硬幣數(shù)目相加,再保存回 bank。

Player類描述了游戲中的一個玩家。每一個 player 在任何時刻都有一定數(shù)量的硬幣存儲在他們的錢包中。這通過 player 的coinsInPurse屬性來體現(xiàn):

    class Player {
        var coinsInPurse: Int
        init(coins: Int) {
            coinsInPurse = Bank.vendCoins(coins)
        }
        func winCoins(coins: Int) {
            coinsInPurse += Bank.vendCoins(coins)
        }
        deinit {
            Bank.receiveCoins(coinsInPurse)
        }
    }

每個Player實例都由一個指定數(shù)目硬幣組成的啟動額度初始化,這些硬幣在 bank 初始化的過程中得到。如果沒有足夠的硬幣可用,Player實例可能收到比指定數(shù)目少的硬幣。

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

    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"

一個新的Player實例隨著一個 100 個硬幣(如果有)的請求而被創(chuàng)建。這個Player實例存儲在一個名為playerOne的可選Player變量中。這里使用一個可選變量,是因為玩家可以隨時離開游戲。設(shè)置為可選使得你可以跟蹤當前是否有玩家在游戲中。

因為playerOne是可選的,所以由一個感嘆號(!)來修飾,每當其winCoins方法被調(diào)用時,coinsInPurse屬性被訪問并打印出它的默認硬幣數(shù)目。

    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"

這里,player 已經(jīng)贏得了 2,000 硬幣。player 的錢包現(xiàn)在有 2,100 硬幣,bank 只剩余 7,900 硬幣。

    playerOne = 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"

玩家現(xiàn)在已經(jīng)離開了游戲。這表明是要將可選的playerOne變量設(shè)置為nil,意思是“沒有Player實例”。當這種情況發(fā)生的時候,playerOne變量對Player實例的引用被破壞了。沒有其它屬性或者變量引用Player實例,因此為了清空它占用的內(nèi)存從而釋放它。在這發(fā)生前一步,其析構(gòu)函數(shù)被自動調(diào)用,其硬幣被返回到銀行。