與構造過程相反,實例最後釋放的時候,需要清除一些資源,這個過程就是析構過程。在析構過程中也會調用一種特殊的方法deinit,稱為析構函數。析構函數deinit沒有返回值,也沒有參數,也不需要參數的小括號,所以不能重載。
下面看看示例代碼:
class Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double){
self.width = width
self.height = height
}
init(W width: Double,H height: Double){
self.width = width
self.height = height
}
deinit { //定義了析構函數
print("調用析構函數...")
self.width = 0.0
self.height = 0.0
}
}
var rectc1: Rectangle? = Rectangle(width: 320, height: 480) //實例rectc1
print("長方形:\(rectc1!.width) x\(rectc1!.height)")
rectc1 = nil //觸發調用析構函數的條件
var rectc2: Rectangle? = Rectangle(W: 320, H: 480) //實例rectc2
print("長方形:\(rectc2!.width) x\(rectc2!.height)")
rectc2 = nil //觸發調用析構函數的條件
析構函數的調用是在實例被賦值為nil,表示實例需要釋放內存,在釋放之前先調用析構函數,然後再釋放。
運行結果如下:
長方形:320.0 x 480.0
調用析構函數...
長方形:320.0 x 480.0
調用析構函數...
析構函數只適用於類,不能適用於枚舉和結構體。類似的方法在C++中也稱為析構函數,不同的是,C++中的析構函數常常用來釋放不再需要的內存資源。而在Swift 中,內存管理采用自動引用計數(ARC),不需要在析構函數釋放不需要的實例內存資源,但是還是有一些清除工作需要在這裡完成,如關閉文件等處理。