標籤:body 手動 判斷 自動產生 red 子類 mes 引用計數 建立
前言
- 與 OC 一樣,Swift 中也存在構造和析構過程。不同的是,OC 中的構造方法和析構方法只是普通的方法,而 Swift 中構造器和析構器是一種特殊的結構。
1、構造器
1.1 指定構造器
指定構造器包含系統自動產生的構造器和除便利構造器及可失敗構造器之外的所有構造器,是預設的初始化方法。
指定構造器必須在 init
中調用父類的指定構造器,而不能調用其自身的其它構造器。
init(參數名1: 參數類型, 參數名2: 參數類型, ...) { statements}
如果沒有在類中實現任何指定構造器,那麼將繼承父類中的所有指定構造器。
// 父類class Transport { var scope = "" init() {} // 無參數指定構造器 init(str: String) { // 有一個參數的指定構造器 self.scope = str }}
// 子類class Car: Transport { // 沒有在類中實現任何指定構造器}
// 使用let myCar = Car() // 使用了父類中的無參數構造器let myNewCar = Car(str: "ludi") // 使用父類中有一個參數的構造器
一旦在子類中建立了自己的指定構造器,將不能再使用父類中的構造器,並且子類中的指定構造器聲明中需要調用父類中的某個指定構造器。
// 父類class Transport { var scope = "" init() {} // 無參數指定構造器 init(str: String) { // 有一個參數的指定構造器 self.scope = str }}
// 子類class Car: Transport { var wheel = "pulisitong" init(scope: String, wheel: String) { // 建立自己的指定構造器 super.init() // 指定構造器必須調用父類的指定構造器 self.scope = scope self.wheel = wheel }}
// 使用let myCar = Car(scope: "ludi", wheel: "miqilin") // 此時不能使用父類中無參或者有一個參數的構造器
1.2 便利構造器
調用其它構造器的構造器就叫便利構造器。
- 便利構造器必須調用一個其它的構造器。
- 便利構造器必須直接或者間接調用指定構造器之後才能訪問其它值,它還可以通過調用其它便利構造器來間接調用指定構造器。
如果一個便利構造器想要調用指定構造器,則它必須並且只能調用本類中的指定構造器,而不能調任何父類的構造器。
convenience init(參數名1: 參數類型, 參數名2: 參數類型, ...) { statements}
如果子類中重寫了父類中所有的指定構造器,那麼將繼承父類中所有的便利構造器。
// 父類class Transport { var scope = "" init() {} // 無參數指定構造器 init(str: String) { // 有一個參數的指定構造器 self.scope = str } convenience init(scope: String) { // 便利構造器 self.init(str: scope) // 調用自身類的指定構造器 }}
// 子類class Car: Transport { override init() { // 重寫父類指定構造器 super.init() // 指定構造器必須調用父類的指定構造器 } override init(str: String) { // 重寫父類指定構造器 super.init() // 指定構造器必須調用父類的指定構造器 self.scope = "Car" + str }}
// 使用let myCar = Car(scope: "ludi") // 調用父類的便利構在器
1.3 可失敗構造器
1.4 匿名構造器
2、析構器
和構造器對應,Swift 還提供了析構器,用於釋放對象。
在把對象設定為 nil
時,系統會自動調用析構器。
deinit { self.conn.close() self.conn = nil}
由於 Swift 中引入了自動引用計數(ARC),因此不需要讀者手動管理記憶體,但在使用一些自己的資源的時候,需要使用析構器。
- 比如我要建立一個資料庫訪問類,在初始化時開啟連結,如果程式退出,串連不釋放,資源就會浪費。
實值型別沒有析構是因為實值型別不會出現 “共用”,每個實值型別只有一個擁有者。
- 比如某個方法,實值型別會在其擁有者被系統回收時一同回收,我們不需要在意實值型別的生命週期。
Swift 構造與析構