一個(gè)類實(shí)例需要被解除分配之前,“deinitializer”被調(diào)用來(lái)釋放內(nèi)存空間。關(guān)鍵字 “deinit' 被用于釋放由系統(tǒng)資源占用的存儲(chǔ)空間。反初始化僅適用于類類型。
Swift 當(dāng)不再需要它們時(shí)自動(dòng)取消分配實(shí)例,以釋放資源。Swift 通過(guò)自動(dòng)引用計(jì)數(shù)(ARC)處理實(shí)例的內(nèi)存管理,如自動(dòng)引用計(jì)數(shù)描述。通常情況下無(wú)需進(jìn)行手動(dòng)清理,實(shí)例會(huì)自動(dòng)被釋放。但是,當(dāng)正在使用自己的資源,可能需要自己進(jìn)行一些額外的清理。例如,如果創(chuàng)建一個(gè)自定義類來(lái)打開(kāi)一個(gè)文件,寫一些數(shù)據(jù),可能需要關(guān)閉該文件在類實(shí)例釋放之前。
var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() println(counter) print = nil println(counter)
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
1 0
當(dāng) print = nil 語(yǔ)句省略計(jì)數(shù)器的值保持不變,因?yàn)樗鼪](méi)有反初始化。
var counter = 0; // for reference counting class baseclass { init() { counter++; } deinit { counter--; } } var print: baseclass? = baseclass() println(counter) println(counter)
當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。
1 1