什麼是析構器,如何在 Swift 中編寫?


在本文中,您將學習如何在 Swift 語言中使用析構器以及為什麼要使用它。您將透過一些示例學習析構器的概念。

當不再需要類例項時,Swift 會自動呼叫一個名為析構器的特定方法。它用於在從記憶體中釋放物件之前執行任何必要的清理工作。“deinit”關鍵字用於建立析構器,它沒有引數或輸出。

語法

以下是 Swift 中析構器的基本語法

class ClassName {
   // Other properties and methods
    
   deinit {
      // Perform cleanup tasks
   }
}

您可以使用 deinit 塊執行清理任務,例如釋放資源(例如關閉檔案、釋放記憶體)、取消計劃的任務、釋放記憶體等。

一旦類例項即將從記憶體中釋放,就會呼叫析構器。這意味著它用於執行在物件從記憶體中刪除之前必須執行的任何清理過程。這可能包括執行諸如釋放物件使用期間分配的記憶體之類的操作。它還可能包括取消任何相關的計劃任務或關閉任何開啟的檔案。

析構器僅適用於類;不支援結構體。這是因為結構體不能被釋放。它們是值型別,當對應的變數離開其作用域時,記憶體就會被釋放。

示例

這是一個使用析構器取消計劃任務的類的示例

import Foundation
class MyTimer {
   var timer: Timer?
    
   init() {
      timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(timerFired), userInfo: nil, repeats: true)
   }    
   deinit {
      timer?.invalidate()
   }    
   @objc func timerFired() {
      // do something
   }
}

在上面的示例中,當初始化 MyTImer 類時,它會建立一個計時器。當不再需要該類例項時,此計時器會自動取消。析構器呼叫計時器的 invalidate 方法以取消計劃的任務。

務必記住,只有當不再需要類例項時,才會呼叫析構器。這實際上意味著將例項的引用計數減少到 0。

示例

這是一個使用析構器釋放其生命週期中分配的記憶體的類的另一個示例

import Foundation
class MyData {
   var data: UnsafeMutableRawPointer?
   var size: Int
    
   init(size: Int) {
      self.size = size
      data = UnsafeMutableRawPointer.allocate(byteCount: size, alignment: 1)
   }
    
   deinit {
      data?.deallocate()
   }
}

在此示例中,初始化後,MyData 類透過呼叫 UnsafeMutableRawPointer 的分配函式來分配記憶體。當不再需要類例項時,記憶體會自動釋放。為了釋放記憶體,析構器執行資料指標的 deallocate 過程。

示例

這是一個使用析構器釋放使用單例模式獲取的資源的另一個有用的示例

import Foundation
class MySingleton {
   static let shared = MySingleton()
   var resource: Resource?
    
   private init() {
      resource = acquireResource()
   }    
   deinit {
      releaseResource(resource: resource)
   }
}

在上面的示例中,它使用 acquireResource 函式在初始化 MySingleton 類後立即獲取資源。一旦類例項的使用完成,資源就會自動被移除。為了執行此操作,析構器透過將資源作為引數來呼叫 releaseResource 函式。

注意 - MySignleton 類使用單例模式,其例項由整個應用程式共享。因此,不會呼叫析構器,因為類例項不會被釋放。

以下是 Swift 中使用析構器的幾個優點

  • 資源管理 - 在從記憶體中刪除物件之前,您可以使用析構器執行任何必要的清理操作。這可能包括諸如釋放記憶體、關閉開啟的檔案和停止計劃的操作之類的操作。

  • 記憶體管理 - 當不再需要類例項時,析構器是確保以正確方式釋放資源的好方法。透過這樣做,可以避免記憶體洩漏——這可能會導致應用程式使用比必要的更多的記憶體。

  • 錯誤處理 - 您不必擔心手動呼叫析構器,因為它們會自動呼叫。這意味著即使出現錯誤,析構器也可以執行清理操作,這有助於防止應用程式崩潰。

  • 正確的清理 - 當您建立包含對其他資源的引用的物件時,請確保在釋放物件時釋放該資源。析構器可以幫助您以可靠且一致的方式做到這一點。

  • 一致的資源使用 - 使用析構器是確保在類的所有例項中統一獲取和釋放資源的好方法。透過這樣做,可以避免錯誤,並且可以更容易地理解應用程式的行為。

  • 良好的實踐 - 建議使用析構器,因為它可以確保資源被正確釋放,並且是記憶體管理的最佳實踐。透過這樣做,您可以確保您的程式碼不會留下任何開啟的檔案或未釋放的記憶體。

結論

在 Swift 中,您可以使用析構器來釋放程式碼中的記憶體使用。您可以確保在不再需要資源時正確釋放資源。它有助於管理記憶體洩漏和其他可能在應用程式中發生並可能導致崩潰的錯誤。

更新於:2023年2月28日

瀏覽量 162

啟動您的職業生涯

完成課程後獲得認證

開始
廣告
© . All rights reserved.