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
廣告