【发布时间】:2018-10-22 18:54:40
【问题描述】:
我在 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,以及这方面的最佳实践是什么。谢谢。
【问题讨论】:
-
我为我之前的错误回答道歉!事实证明你是完全正确的。我总是使用
[unowned self]来处理这种情况。 -
你为什么不使用
[weak self],因为你发现它没有问题? -
是的,可以做到。但我最终还是使用了
strongSelf以获得更好的可读性。
标签: swift cocoa key-value-observing completionhandler