
- Swift 教程
- Swift - 首頁
- Swift - 概述
- Swift - 環境
- Swift - 基本語法
- Swift - 變數
- Swift - 常量
- Swift - 字面量
- Swift - 註釋
- Swift 運算子
- Swift - 運算子
- Swift - 算術運算子
- Swift - 比較運算子
- Swift - 邏輯運算子
- Swift - 賦值運算子
- Swift - 位運算子
- Swift - 其他運算子
- Swift 高階運算子
- Swift - 運算子過載
- Swift - 算術溢位運算子
- Swift - 恆等運算子
- Swift - 範圍運算子
- Swift 資料型別
- Swift - 資料型別
- Swift - 整數
- Swift - 浮點數
- Swift - Double
- Swift - 布林值
- Swift - 字串
- Swift - 字元
- Swift - 類型別名
- Swift - 可選值
- Swift - 元組
- Swift - 斷言和前提條件
- Swift 控制流
- Swift - 決策
- Swift - if 語句
- Swift - if...else if...else 語句
- Swift - if-else 語句
- Swift - 巢狀 if 語句
- Swift - switch 語句
- Swift - 迴圈
- Swift - for in 迴圈
- Swift - while 迴圈
- Swift - repeat...while 迴圈
- Swift - continue 語句
- Swift - break 語句
- Swift - fallthrough 語句
- Swift 集合
- Swift - 陣列
- Swift - 集合
- Swift - 字典
- Swift 函式
- Swift - 函式
- Swift - 巢狀函式
- Swift - 函式過載
- Swift - 遞迴
- Swift - 高階函式
- Swift 閉包
- Swift - 閉包
- Swift - 轉義和非轉義閉包
- Swift - 自動閉包
- Swift 面向物件程式設計
- Swift - 列舉
- Swift - 結構體
- Swift - 類
- Swift - 屬性
- Swift - 方法
- Swift - 下標
- Swift - 繼承
- Swift - 重寫
- Swift - 初始化
- Swift - 析構
- Swift 高階
- Swift - ARC 概述
- Swift - 可選鏈
- Swift - 錯誤處理
- Swift - 併發
- Swift - 型別轉換
- Swift - 巢狀型別
- Swift - 擴充套件
- Swift - 協議
- Swift - 泛型
- Swift - 訪問控制
- Swift - 函式與方法
- Swift - SwiftyJSON
- Swift - 單例類
- Swift 隨機數
- Swift 不透明型別和裝箱型別
- Swift 有用資源
- Swift - 線上編譯
- Swift - 快速指南
- Swift - 有用資源
- Swift - 討論
Swift - 析構
析構是釋放類例項不再需要時記憶體資源的過程。析構器僅適用於類,不適用於結構體或列舉。Swift 不會立即在例項不再需要時呼叫析構器,而是在例項被釋放之前呼叫它,這個時機由自動引用計數 (ARC) 系統管理。
一個類只能有一個析構器。
析構器是自動呼叫的,開發者不允許手動呼叫它們。
析構器的呼叫時機不是由開發者顯式控制的,而是由 ARC 自動確定的。
迴圈引用可能會阻止析構。
超類的析構器會被其子類繼承,並且超類的析構器會在子類析構器的實現之後呼叫(即使子類沒有自己的析構器)。
眾所周知,例項只有在其析構器被呼叫後才會被釋放,這意味著析構器可以訪問和修改例項的屬性。
在類中定義析構器
在 Swift 中,我們可以在類中使用“deinit”關鍵字定義析構器。析構器中的程式碼將在類的例項被釋放時執行。析構器不接受任何引數。
語法
以下是析構器的語法
class className{ // Properties and methods of class // Deinitializer deinit { // statement } }
示例
建立析構器的 Swift 程式。
// Defining class class Student { // Property of class var name: String // Initializer to initialize instance init(name: String) { self.name = name print("\(name) is initialized") } // Deinitializer to deinitialize instance deinit { print("\(name) is deinitialized") } } // Creating and initializing instances of the student class var object1: Student? = Student(name: "Mira") var object2: Student? = Student(name: "Jenni") // Deinitializers will be called when instances are deallocated object1 = nil object2 = nil
輸出
它將產生以下輸出:
Mira is initialized Jenni is initialized Mira is deinitialized Jenni is deinitialized
使用析構器釋放記憶體空間
在 Swift 中,析構由自動引用計數 (ARC) 處理。自動引用計數是一種記憶體管理機制,用於跟蹤例項引用並在不再需要物件時釋放它們。儘管 Swift 自動釋放記憶體資源,我們不需要執行手動清理,但如果我們正在使用自己的資源,那麼我們可能需要手動清理它們。例如,如果我們建立一個自定義類來開啟檔案並向其中寫入一些資料,我們可能需要在類例項被釋放之前關閉檔案。
現在,我們將看到析構器是如何工作的:
步驟 1 - 使用“init”初始化器建立並初始化類的新的例項。
步驟 2 - 使用具有強引用的類的例項。只要至少有一個強引用指向該物件,類的例項就會保持活動狀態。
步驟 3 - 當對物件的最後一個強引用終止時,ARC 將在物件被釋放之前自動呼叫析構器。
步驟 4 - 現在執行析構器中的程式碼,並且給定類的例項將被釋放。記憶體可供其他物件使用。
這就是析構器的工作方式。
示例
演示析構器如何工作的 Swift 程式。
var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() print(counter) print = nil print(counter)
輸出
它將產生以下輸出:
1 0
當省略print = nil語句時,計數器的值保持不變,因為它沒有被析構。
示例
var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() print(counter) print(counter)
輸出
它將產生以下輸出:
1 1