標籤:
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 記憶體管理