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,那麼采用無業引用。
轉載于:https://www.cnblogs.com/pengzhaov/p/4433288.html