簡體   English   中英

Swift:嵌套閉包中的自引用

[英]Swift: self reference in nested closures

我正在Swift中使用新的基於塊的KVO API來觀察屬性。 下面是示例代碼。

class A: NSObject {
var observerA: NSKeyValueObservation? = nil
var observerB: NSKeyValueObservation? = nil

var property1: CustomObj1?
var property2: CustomObj2?

func doSomething() {

}

func doSomethingElse() {

}

func observeValues() {
    observerA = customObj1.observe(\.property1, options: [], changeHandler: { [weak self] (obj, change) in
        guard let strongSelf = self else { return }
        strongSelf.doSomething()
        strongSelf.observerB = customObj2.observe(\.property2, options: [], changeHandler: { [weak strongSelf] (nestedObj, nestedChange) in
            guard let nestedStrongSelf = strongSelf else { return }
            nestedStrongSelf.doSomethingElse()
        })
    })
}

}

我的問題是我們如何在內部變更處理程序塊中引用self 我可以像上面一樣使用它,但看不到任何內存泄漏。 但是在內部變更處理程序中的“ [weak strongSelf]”中使用self代替strongSelf也不會引起任何問題。 這是代碼。

func observeValues() {
observerA = self.observe(\.property1, options: [], changeHandler: { [weak self] (obj, change) in
    guard let strongSelf = self else { return }
    strongSelf.doSomething()
    strongSelf.observerB = strongSelf.observe(\.property2, options: [], changeHandler: { [weak self] (nestedObj, nestedChange) in
        guard let nestedStrongSelf = self else { return }
        nestedStrongSelf.doSomethingElse()
    })
})

}

我的問題是,應如何在嵌套完成處理程序中引用self以及在此過程中的最佳做法是什么? 謝謝。

即使您擁有強大的參考周期,也不會看到任何內存泄漏,直到所有其他強大的參考消失為止。

例如,如果該VC在整個應用程序生命周期中都有效,即使閉包捕獲了強大的參考周期,它也無濟於事。 影響將是相同的:VC將在整個應用程序生命周期中保持活力,無論如何它都已經在這樣做。

只有在具有強引用周期的情況下,您才能夠識別內存泄漏,然后嘗試通過刪除所有其他強引用來取消初始化VC。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM