-
前言:
swift允許為類(枚舉、結構體不允許)定義析構器:在實例將要銷毀之前,系統(tǒng)會自動調用該實例的析構器(實例不允許主動調用自己的析構器)。swift析構器的本質就是一個名為deinit的函數(不允許使用func關鍵字)。
-
類的指定構造器和便利構造器
1、swift為類提供了兩種構造器來確保所有的實例存儲屬性都能得到初始值,它們分別是指定構造器和便利構造器。
2、通常一個類至少要有一個指定構造器,它負責初始化類中所有的實例存儲屬性(包括自己的屬性和從父類繼承的屬性)。
3、便利構造器屬于次要的、輔助性的構造器,類中可以不定義便利構造器,便利構造器必須調用同一個類中的其他構造器來完成初始化。
convenience init (形參) {
self.init()
}
注意:
1、只有類中才有便利構造器的概念,結構體、枚舉都不支持便利構造器。
2、在構造器中調用其他構造器來執(zhí)行構造的過程被稱為構造器代理。
-
可能失敗的構造器
對于類而言,可能失敗的構造器必須滿足如下兩個條件之后才能觸發(fā):
1、該類中的所有實例存儲屬性都已被賦初始值(既可由程序顯式指定初始值,也可由系統(tǒng)隱式分配默認的初始值)。
2、所有的構造器調用都已經被執(zhí)行(即:return nil 不能位于self.init()或者super.init()代碼之前)。
-
可能失敗的構造器的傳播
對于類的構造器而言,普通構造器永遠不能調用可能失敗的構造器(不管是父類的可能失敗的構造器,還是同一個類中可能失敗的構造器)。
-
重寫可能失敗的構造器
使用普通構造器重寫父類的構造器。類中的構造器永遠不能調用需要強制解析的可能失敗的構造器,但可以調用支持隱式解析的可能失敗的構造器。
-
子類必須包含的構造器
1、swift允許在父類構造器前添加required關鍵字,該關鍵字用于聲明所有子類必須包含該required構造器。
2、父類中聲明的required構造器既可以是指定構造器,也可是便利構造器。
3、重新required修飾的構造器,不需要override。
-
析構器
- 在實例被銷毀之前,程序可能需要釋放一些物理資源(并非釋放內存,內存釋放有系統(tǒng)自動完成),比如在實例創(chuàng)建時打開了一個文件、打開了一個網絡連接等,在實例銷毀之前就應該釋放這些物理資源。此時可以借助類的析構器來實現(xiàn)。
- 析構器是一個名為deinit的函數(也無須使用func關鍵字),析構器deinit沒有返回值,也沒有參數(甚至不能有圓括號),因此不能重載它。
- 析構器在實例釋放之前由系統(tǒng)自動調用,因此不要主動調用析構器,子類會自動繼承父類的析構器,如果子類實現(xiàn)了自己的析構器,子類析構器執(zhí)行結束時將自動調用父類的析構器,無論如何,子類析構器一定會調用父類析構器。
- 只有等到析構器地道用完成后,該實例才會被銷毀,所以析構器可以訪問該實例的所有實例存儲屬性