首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Swift defer 語句:類比 C++/Ruby finally 的資源清理機制

     編輯:關於C++

背景:finally 模式

C++ 無 `finally` 關鍵字,依賴 RAII(析構函數)保證資源釋放。Ruby 有 `ensure` 塊。Java 有 `finally` 塊。Swift 引入 `defer` 語句,提供統一、靈活的延遲執行機制。

defer 語法與執行規則


defer {
    // 清理代碼
}
  • 作用域結束時執行(函數返回、拋出錯誤、作用域結束)。
  • 多個 `defer` 後進先出(LIFO)執行,類似棧。
  • 可出現在任何位置,不限於錯誤處理上下文。
  • 甚至可在 `guard` 失敗提前返回前執行。

代碼示例分析


var isTrue = false
func test(name: String) -> Bool {
    isTrue = true
    defer { isTrue = false }
    print("now isTrue is \(isTrue)") // 輸出 true
    return name == "hopy"
}
test("hopy")
print(isTrue) // 輸出 false

執行流程:

  1. 進入 `test`,`isTrue = true`。
  2. 註冊 `defer` 閉包(將 `isTrue = false` 入棧)。
  3. 打印 `true`。
  4. 返回 `true`。
  5. 函數返回前,彈出執行 `defer` 閉包,`isTrue = false`。
  6. 外部打印 `false`。

進階用法

  • 文件/網絡/鎖資源管理:`defer { file.close() }` `defer { lock.unlock() }`。
  • 多資源按獲取順序反序釋放(LIFO 保證正確順序)。
  • 條件性註冊:`if let f = open() { defer { f.close() } ... }`。
  • 循環中每次迭代結束執行(每次迭代獨立作用域)。

對比總結

語言機制特點
C++RAII / 智能指針編譯期確定,零開銷,需定義類
Javatry-catch-finally運行時塊結構,異常安全
Rubybegin-ensure-end關鍵字塊,動態
Swiftdefer語句級、作用域綁定、LIFO、通用清理

最佳實踐

  • 資源獲取緊隨 `defer` 註冊釋放,視覺配對,防止遺漏。
  • 避免在 `defer` 中拋出錯誤(會阻斷後續 `defer`)。
  • 大塊清理邏輯提取為私有方法,`defer` 中調用,保持簡潔。

總結

`defer` 是 Swift 資源管理的基石,語法輕量、語義清晰、適用面廣(不限錯誤處理),體現現代語言對「正確性默認」的設計哲學。掌握 `defer` 可編寫更健壯、可維護的 Swift 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved