二
.類的構造和析構
1. 通過整合後,子類中不僅有父類中的儲存屬性,還有子類自己的儲存屬性。子類中的所有儲存屬性都必須在構造器中設定初始值,因此類的構造過程會相對比較複雜。
2. 與構造器相反的是,
swift
允許為類(列舉、結構體不允許)定義析構器:在例項臨近銷毀之前,系統會自動呼叫該例項的析構器(例項不允許主動呼叫自己的析構器)。
swift
中析構器的本質就是乙個名為
deinit
的函式。
----
這個函式不允許使用
func
關鍵字。
3. 類的指定構造器和便利構造器:
swift
為類提供了兩種構造器來確保所有的例項儲存屬性都能得到初始值。這兩個構造器是:指定構造器和便利構造器。
4. 通常乙個類至少要有乙個指定構造器,指定構造器必須負責初始化類中所有的例項儲存屬性。指定構造器可通過父類鏈呼叫父類構造器初始化從父類繼承得到的屬性,還必須對自己的例項儲存屬性進行初始化。
5. 便利構造器屬於次要的、輔助性的構造器,類中可以沒有便利構造器。便利構造器必須呼叫同乙個類中的其他構造器來完成初始化。
6. 如果程式需要在類中定義便利構造器,則需要在構造器的
init
之前新增
convenience
關鍵字。語法如下:
convenience init(形參)
7. 對比與便利構造器,不加任何特殊修飾符的構造器就是指定構造器。
8. 只有類中才有便利構造器,結構體和列舉都不支援便利構造器。
9. 舉個栗子:
//定義便利構造器,使用
convenience
修飾convenience init(n name : string, w weight : double)
} 紅富士
", w : 1.2)
花牛蘋果
", weight : 1.4)
----
上面**中包含了兩個構造器,這兩個構造器的外部形參名不同,這就是構造器重載。最後兩行**分別呼叫了兩個構造器來建立了兩個
例項。10.
類的構造器鏈
----swift
對構造器之間的呼叫鏈制定了如下
3條規則:(1
)規則1
:子類構造器必須呼叫直接父類的指定構造器。(2
)規則2
:便利構造器必須呼叫同乙個類中的其他構造器(3
)規則3
:便利構造器呼叫的構造器鏈最終節點必須是指定構造器。
上面的3
條規則,總結一下就是:
指定構造器總是必須向上**;
便利構造器總是必須橫向**。
----
在構造器中呼叫其他構造器來執行構造的過程被稱為構造器**。
11.
兩段式構造
----swift
類的構造需要兩個階段來完成;(
1)第一階段:先為儲存屬性分配內容,使用本類的構造器初始化由本類定義的儲存屬性;然後沿著構造器鏈向上,
逐個呼叫各父類構造器初始化對應父類定義的儲存屬性;(2
)第二階段:從最頂層父類開始,沿著頂部構造器鏈向下,每個構造器都可以再次修改儲存屬性。
----
總結:向上呼叫,向下修改。
12.
為了保證兩段式構造順利完成,
swift
提供了4
種安全檢查:(1
)安全檢查一:制定構造器必須
****
先*****
初始化當前類中定義的例項儲存屬性,然後才能向上呼叫父類構造器;(2
)安全檢查二:制定構造器必須
****
先****
向上呼叫父類構造器,然後才能對繼承得到的屬性賦值。原因很簡單:如果先對繼承得到的屬性賦值,然後呼叫父類構造器,那麼富類構造器會把指定構造器所賦的值覆蓋掉。(3
)安全檢查三:便利構造器必選
****
先***
呼叫同乙個類的其他構造器,然後才能對屬性賦值。原因很簡單:如果先對屬性賦值,然後呼叫其他構造器,那麼其他構造器會把便利構造器所賦的值覆蓋掉。(4
)安全檢查四:構造器在第一階段完成之前,不能
呼叫例項方法,不能讀取例項屬性。
13.
不難發現,
swift
中類的構造器規則是比較麻煩的,因此處理起來也比較容易出錯。但如果程式顯式地為所有例項
儲存屬性都指定初始值,定義構造器時就會簡單很多,而且可以直接利用系統預設的構造器。因此,一般建議為例項儲存屬性都指定初始值。
每天學一點Swift 物件導向下 七
十一 使用協議作為型別 1.協議也相當於一種型別,與列舉 結構體 類相比,協議相當於一種抽象的型別,它被徹底抽象成只定義規範,不負責實現。因此定義協議之後,就可以像列舉 結構體 類那樣當作型別來使用,只是協議不能直接用於建立例項,協議可以做如下方面的用途 1 可使用協議宣告變數 2 可使用協議作為函...
每天學一點Swift 物件導向下 十
十九 swift 記憶體管理 1.swift 提供了強大的記憶體管理機制 swift 通過自動引用計數 arc 可以很好地管理物件的 大部分時候,程式無須關心 swift 物件的 但在某些特殊情況下,swift 要求程式設計師進行一些記憶體管理的處理。2.只有引用型別變數所引用的物件才需要使用引用計...
每天學一點Swift 物件導向上 十二
十四 構造器 1.構造器用於完成例項的構造過程。這個過程包括為例項中的每個儲存屬性設定初始值和執行必要的準備和初始化任務。2.swift 的構造器本質上就是乙個或多個名為 init 的函式 不允許使用 func 關鍵字 3.構造器的主要作用就是完成例項中每個類 結構體中例項儲存屬性 列舉不能定義例項...