Swift 析構(gòu)過(guò)程

在一個(gè)類(lèi)的實(shí)例被釋放之前,析構(gòu)函數(shù)被立即調(diào)用。用關(guān)鍵字deinit來(lái)標(biāo)示析構(gòu)函數(shù),類(lèi)似于初始化函數(shù)用init來(lái)標(biāo)示。析構(gòu)函數(shù)只適用于類(lèi)類(lèi)型。


析構(gòu)過(guò)程原理

Swift 會(huì)自動(dòng)釋放不再需要的實(shí)例以釋放資源。

Swift 通過(guò)自動(dòng)引用計(jì)數(shù)(ARC)處理實(shí)例的內(nèi)存管理。

通常當(dāng)你的實(shí)例被釋放時(shí)不需要手動(dòng)地去清理。但是,當(dāng)使用自己的資源時(shí),你可能需要進(jìn)行一些額外的清理。

例如,如果創(chuàng)建了一個(gè)自定義的類(lèi)來(lái)打開(kāi)一個(gè)文件,并寫(xiě)入一些數(shù)據(jù),你可能需要在類(lèi)實(shí)例被釋放之前關(guān)閉該文件。

語(yǔ)法

在類(lèi)的定義中,每個(gè)類(lèi)最多只能有一個(gè)析構(gòu)函數(shù)。析構(gòu)函數(shù)不帶任何參數(shù),在寫(xiě)法上不帶括號(hào):

deinit {
    // 執(zhí)行析構(gòu)過(guò)程
}

實(shí)例

var counter = 0;  // 引用計(jì)數(shù)器
class BaseClass {
    init() {
        counter += 1;
    }
    deinit {
        counter -= 1;
    }
}

var show: BaseClass? = BaseClass()
print(counter)
show = nil
print(counter)

以上程序執(zhí)行輸出結(jié)果為:

1
0

當(dāng) show = nil 語(yǔ)句執(zhí)行后,計(jì)算器減去 1,show 占用的內(nèi)存就會(huì)釋放。

var counter = 0;  // 引用計(jì)數(shù)器

class BaseClass {
    init() {
        counter++;
    }
    
    deinit {
        counter--;
    }
}

var show: BaseClass? = BaseClass()

print(counter)
print(counter)

以上程序執(zhí)行輸出結(jié)果為:

1
1