析構 Swift學習筆記(十八)

2021-06-22 16:03:12 字數 2131 閱讀 9698

注:本文為自己學習the swift programming language的筆記,其中的例子為引用原書和其他博文或自己原創的。每個例子都會批註一些實踐過程中的經驗或思考總結。

1.基礎

析構過程[deinitialization]由析構函式[deinitializer]完成,類的例項在被**資源之前析構函式被呼叫,只有類才有析構函式。定義析構函式使用關鍵字deinit,格式和建構函式相同。

2.析構過程的完成

swift自動**不再使用的例項以釋放資源,它通過自動引用計數[automatic reference counting,afc]實現例項的記憶體管理。程式設計師不需要人工的實現例項**,但是可以在**之前完成一些有必要的工作:比如乙個開啟檔案並訪問檔案的類在**之前一定要關閉檔案才行,這項工作可以交給析構函式來完成,它在類的例項在被**資源之前被呼叫。

乙個類最多能有乙個析構函式,析構函式沒有任何穿入引數也沒有返回值:

deinit
析構函式是自動呼叫的,不能顯式的呼叫它。子類繼承超類的析構函式,子類的析構函式的實現完成之前自動呼叫超類析構函式,即使子類沒有自己的析構函式超類的析構函式仍然在子類例項被**時自動呼叫。

因為析構函式是在**之前被呼叫的,它可以訪問修改所有的屬性並根據這些屬性值做出相應工作。

3.析構過程的實現

通過乙個例子來熟悉析構函式的使用,例子中包括了兩個型別bank和player。bank結構體管理一種流通量不超過10000的虛擬貨幣,因為只有乙個bank所以結構體和靜態屬性和方法實現:

struct bank 

static func receivecoins(coins: int)

}

bank記錄當前銀行剩餘貨幣,並有乙個分配貨幣方法和收回貨幣方法,它們都是靜態的。

player類描述了遊戲中的玩家,每個玩家錢包裡有一些初始的貨幣,它可以從銀行中贏取貨幣。player類有乙個析構函式,它實現了在player例項被**時將其持有貨幣收回銀行,保證總的貨幣數保持10000:

class player 

func wincoins(coins: int)

deinit

}

通過跟蹤player例項和bank結構體的總貨幣數來理解析構過程:

var playerone: player? = player(coins: 100)

println("a new player has joined the game with \(playerone!.coinsinpurse) coins")

println("there are now \(bank.coinsinbank) coins left in the bank")

playerone!.wincoins(2_000)

println("playerone won 2000 coins & now has \(playerone!.coinsinpurse) coins")

println("the bank now only has \(bank.coinsinbank) coins left")

playerone = nil

println("playerone has left the game")

println("the bank now has \(bank.coinsinbank) coins")

/*prints

a new player has joined the game with 100 coins

there are now 9900 coins left in the bank

playerone won 2000 coins & now has 2100 coins

the bank now only has 7900 coins left

playerone has left the game

the bank now has 10000 coins

*/

playerone賦值nil時swift自動**之前的例項,呼叫player類的析構函式把玩家剩餘貨幣返還給銀行。

學習Swift 析構過程

析構器只適用於類型別,當乙個類的例項被釋放之前,析構器會被立即呼叫。析構器用關鍵字deinit來標示,類似於構造器要用init來標示。swift 會自動釋放不再需要的例項以釋放資源,swift 通過自動引用計數 arc 處理例項的記憶體管理。通常當你的例項被釋放時不需要手動地去清理。但是,當使用自己...

swift學習記錄(析構器)

析構器只適用於類型別,當乙個類的例項被釋放之前,析構器會被立即呼叫。析構器用關鍵字deinit 來標示。在類中,每個類只能有乙個析構器。基本語法 deinit析構過程原理 swift 通過自動引用計數 arc 來管理記憶體,會自動釋放不在需要的類來釋放資源。通常例項被釋放時不需要手動去釋放資源。但當...

Swift學習 2 15 析構過程

參考swift 官方教程 the swift programming language 中文版 在乙個類的例項被釋放之前,析構函式被立即呼叫。用關鍵字deinit來標示析構函式,類似於初始化函式用init來標示。析構函式只適用於類型別。swift 會自動釋放不再需要的例項以釋放資源。如自動引用計數那...