swift-類的構造與析構

  • 前言:

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。

  • 析構器

  1. 在實例被銷毀之前,程序可能需要釋放一些物理資源(并非釋放內存,內存釋放有系統(tǒng)自動完成),比如在實例創(chuàng)建時打開了一個文件、打開了一個網絡連接等,在實例銷毀之前就應該釋放這些物理資源。此時可以借助類的析構器來實現(xiàn)。
  2. 析構器是一個名為deinit的函數(也無須使用func關鍵字),析構器deinit沒有返回值,也沒有參數(甚至不能有圓括號),因此不能重載它。
  3. 析構器在實例釋放之前由系統(tǒng)自動調用,因此不要主動調用析構器,子類會自動繼承父類的析構器,如果子類實現(xiàn)了自己的析構器,子類析構器執(zhí)行結束時將自動調用父類的析構器,無論如何,子類析構器一定會調用父類析構器。
  4. 只有等到析構器地道用完成后,該實例才會被銷毀,所以析構器可以訪問該實例的所有實例存儲屬性
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 本章將會介紹 存儲屬性的初始賦值自定義構造過程默認構造器值類型的構造器代理類的繼承和構造過程可失敗構造器必要構造器...
    寒橋閱讀 843評論 0 0
  • 構造過程 構造過程是使用類、結構體或枚舉類型的實例之前的準備過程。在新實例可用前必須執(zhí)行這個過程,具體操作包括設置...
    蠱毒_閱讀 785評論 0 2
  • 構造過程是使用類、結構體或枚舉類型的實例之前的準備過程。在新實例可用前必須執(zhí)行這個過程,具體操作包括設置實例中每個...
    莽原奔馬668閱讀 762評論 0 3
  • 1. 繼承 一個類可以繼承另一個類的方法,屬性和其它特性。當一個類繼承其它類時,繼承類叫子類,被繼承類叫超類(或父...
    路飛_Luck閱讀 488評論 0 1
  • 下標腳本 下標腳本 可以定義在類、結構體和枚舉這些目標中,可以認為是訪問集合(collection),列表(li...
    cht005288閱讀 543評論 0 0

友情鏈接更多精彩內容