iOS 保留周期:
典型的例子是A有B,B有A。
那么如果 A 有 B & C ,B 有 C 呢?
它仍然保持回圈嗎?
是否存在當保留回圈存在時deinit不會呼叫的強關系ARC?
這是示例代碼:
class ViewModel{
func doSth(){
print("123")
}
deinit{
print("ViewModel")
}
}
class CustomView: UIView{
var viewModel: ViewModel?
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
viewModel?.doSth()
}
deinit{
print("CustomView")
}
}
class ViewController: UIViewController {
var viewModel = ViewModel()
lazy var widget: CustomView = {
let v = CustomView(frame: CGRect(origin: .zero, size: CGSize(width: 150, height: 150)))
v.backgroundColor = UIColor.red
v.viewModel = viewModel
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(widget)
}
deinit{
print("ViewController")
}
}
當ViewControllerpopped 時,deinit上面三個方法都被呼叫。
所以沒有保留周期。
是嗎?
uj5u.com熱心網友回復:
確定是否有保留周期的一種簡單方法是繪制圖表。對強參考使用箭頭,對弱/無主參考使用虛線箭頭。
如果您可以沿著實線箭頭從一個物件回傳到同一個物件,那么您就有了一個保留周期。
在您的情況下,A 擁有 B 和 C,B 也擁有 C,有 2 個對 C 的擁有參考,但沒有“向后”強參考。您無法回圈回到 A 或 B,因此沒有保留回圈。
閉包是另一個不明顯的保留周期的潛在來源。如果您有一個參考“self”的“轉義”閉包,并且您持有對該閉包的強參考,則您有一個保留回圈,因為您擁有對閉包的self參考,并且閉包通過它的參考具有強參考給你。
編輯:
我教新開發人員避免保留回圈的方法是根據“向前”和“向后”參考進行思考。前向參考應該是強參考,而后向參考應該是弱參考。
如果考慮雙向鏈表,則前向指標應該很強,而后向指標應該很弱。
如果您擁有一個物件,則指向它的指標應該很強。如果您是該物件的委托,請將委托指標視為向后指標。應該是弱的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/395123.html
上一篇:如何將具有任何回傳型別的func作為引數傳遞給另一個函式?
下一篇:從多個視圖控制器訪問資料/功能
