swift裡迴圈引用問題

2021-08-30 19:50:03 字數 817 閱讀 4464

在參加面試的時候經常會被問得乙個問題就是「你在工作中有沒有遇到迴圈引用的情況?」

首先我們先看段**

var newsuccesscb: (() -> ())?

override func viewdidload()

}func demo(successcb: @escaping () -> ()) -> void

}}

說明此段偽**只是為了掩飾迴圈引用。在xode上執行時會報錯,編譯器會提示你在newsuccesscb前面加上self。先說明一下這是為什麼呢?因為在閉包會對self進行一次cope,在閉包執行完成以後,會自動銷毀,同時釋放對self的引用

回到**來看,要實現迴圈引用,就要形成乙個環,就是要閉包對self做引用,同時self需要對閉包引用。單方向的引用不會產生迴圈引用。

解決方案

var newsuccesscb: (() -> ())?

override func viewdidload()

}func demo(successcb: @escaping () -> ()) -> void

}}

解除迴圈引用有兩種

[weak self] 和 [unowned self]對應到oc裡面就是__weak和__unsafe_unretained

[weak self]表示閉包裡對self的所有引用都是弱引用。如果self釋放了,會自動設定為nil。

[unowned self]表示閉包裡的self都是assign的,不會強引用,如果物件被釋放,指標位址不會變,在訪問就會出現野指標訪問。

Swift 迴圈引用

要解決閉包引起的迴圈引用,swift 中引入了 捕獲列表 的概念,在閉包的引數列表中將閉包體中涉及的所有被 持有 物件宣告為 無主引用 或者 弱引用 以逗號隔開。將閉包作為類的屬性是一種非常常見的做法,相比於定義乙個方法,定義乙個閉包型別的屬性可以隨時修改閉包中的執行內容,以此達到復用的效果,減少乙...

Swift 排查引用迴圈

恢復內容開始 一 最近使用rxswift在多次訊號的巢狀中,發現乙個物件始終始終無法釋放 開始想通過memory graph驗證是否沒有釋放,一直報錯,後來確認是xcode的bug 始終無法確認問題,只能考慮使用乙個弱引用的陣列來驗證了 final class weakbox 類定義 private...

Swift 記憶體管理,迴圈引用

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