[英]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.