Swift 記憶體管理

來源:互聯網
上載者:User

標籤:

1、Object-C 經曆兩個階段: 1、手動引用計數記憶體管理(Manual Reference Counting,MRC) 2、自動引用計數記憶體管理(Automatic Refernce Counting,ARC)

2、參考型別 記憶體配置到 堆 上,需要人為管理。 實值型別 記憶體配置到 棧 上,有處理器管理。

3、每個類建立的對象都有一個內部計數器,這個計數器跟蹤對象的引用次數,成為 引用計數(Reference Count,簡稱 RC)。當對象被建立時候,引用計數為1,每次對象被引用的時候會是其引用計數加1,如果不需要的時候,對象引用斷開(賦值 nil),其中引用計數 減1.當對象引用計數為 0 的時候,對象記憶體才被釋放。

  備忘:init(){}  類的構造方法中 會將執行個體與對象建立"強引用" 關係, deinit{} 析構方法 只有當引用計數為 0 時候才會執行。

4、強引用迴圈:

  當兩個對象的儲存屬性相互引用對方的時候,一個對象釋放的前提是對方先釋放,另一個對象釋放前提也是對象先釋放,這樣就會導致"死結"的狀態,導致記憶體泄露。

解決強迴圈 兩種方式:1、弱引用 2、無主引用。

  弱引用:允許其中一個對象不採用強參考型別方式引用另外一個對象,這樣就不會引起強引用迴圈問題。弱引用適合與 引用對象可以沒有值的情況,因為弱引用可以沒有值,我們必須講一個弱引用 聲明為可選類型,使用weak 聲明弱引用。

  例如:員工A類 儲存屬性 部門, 部門B類  部門領導(員工), 如果部門可以沒有 部門領導,那麼可以將 B類 部門領導 屬性 使用 weak 修飾, 那麼A、B 之間不存在循環參考。

 

  無主引用:其中一個對象不採用強引用另外一個對象。無主引用適用於引用對象永遠有值情況,它總是被定義為非可選類型,使用關鍵字unowned。

  例如:一個員工可以沒有部門,一個部門必須有部門領導,那麼可以將B類  unowned var manager :Employee ,建立無主引用。

5、lazy 修飾表示 消極式載入。 lazy var fullName:()->String={ return a+b} ,類的屬性 可以在閉包中使用,必須使用 lazy 消極式載入,及所有屬性初始化後,self表示對象才會被建立和使用。

6、閉包引用迴圈: 如果閉包與捕獲對象總是相互引用並且總是同時銷毀,則將閉包內的捕獲聲明為無主引用。

           當捕獲的對象有可能為nil時,則將閉包內的捕獲聲明為 弱引用。如果捕獲的對象絕對不會為nil,那麼採用無業引用。

 

Swift 記憶體管理

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.