swift - Swift:嵌套闭包中的自引用
问题描述
我在 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。
推荐阅读
- r - 无论如何在 Latex 中集成 R highchart 交互式绘图?还是保存它们以使它们具有交互性?
- jupyter-notebook - 如何修复 MethodError:没有方法匹配?
- python - 无法在 cgi-bin url 中执行 Python3 正在通过 python2 执行
- c++ - 重置 SetConsoleCtrlHandler 以关闭当前控制台
- javascript - 使用简单总和时返回 NaN 的对象
- twilio - 如何在 twilio 函数中设置流变量
- c - 即使在预处理之后,__builtin_va_arg() 是如何工作的?
- python - 熊猫数据框操作
- python - 使用 PCA 进行降维。为什么没有出现图表中的所有数字?
- r - 向 R 中的对象添加静默属性,以便除非直接检查,否则它不会打印到控制台?