Swift 記憶體管理

2022-03-06 01:27:06 字數 1156 閱讀 9789

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= ,類的屬性 可以在閉包中使用,必須使用 lazy 延遲載入,及所有屬性初始化後,self表示物件才會被建立和使用。

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

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

swift 記憶體管理

不管在什麼語言裡,記憶體管理的內容都很重要,所以我打算花上比其他 tip 長一些的篇幅仔細地說說這塊內容。swift 是自動管理記憶體的,這也就是說,我們不再需要操心記憶體的申請和分配。當我們通過初始化建立乙個物件時,swift 會替我們管理和分配記憶體。而釋放的原則遵循了自動引用計數 arc 的規...

Swift記憶體管理 示例講解

具體而言,swift中的arc記憶體管理是對引用型別的管理,即對類所建立的物件採用arc管理。而對於值型別,如整型 浮點型 布林型 字串 元組 集合 列舉和結構體等,是由處理器自動管理的,程式設計師不需要管理它們的記憶體。一 引用計數 每個swift類建立的物件都有乙個內部計數器,這個計數器跟蹤物件...

Swift 記憶體管理,迴圈引用

在執行時點選 如果有記憶體洩漏的問題,在左側列表會出現如下 然後點選出問題的會出現如下圖,乙個contact類的物件和乙個number類的物件迴圈引用 allocation 分配記憶體 initialization 初始化 使用deinitialization deallocation 記憶體 可以...