ios - 闭包递归和保留循环
问题描述
我的关闭保留了自己。它会导致捕获内部的所有其他对象。我可以使用弱引用传递这样的对象,但它并没有解决保留周期的问题。在没有保留循环的情况下使用闭包进行递归的正确方法是什么?
class Foo {
var s = "Bar"
deinit {
print("deinit") // Won't be executed!
}
}
class TestVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let foo = Foo() // Weak works, but not the right solution.
var closure: () -> Void = { return }
closure = {
print(foo.s)
if true {
return
} else {
closure()
}
}
}
}
解决方案
您有一个不寻常的设置,您的闭包会自行保留。请注意,Swift 不允许您创建对闭包的弱引用。
要打破保留周期,请在递归的基本情况下设置closure
为{ }
。这是一个测试 macOS 命令行程序:
func test() {
var closure: ((Int) -> ()) = { _ in }
closure = { i in
if i < 10 {
closure(i + 1)
} else {
// Comment out this line for unbounded memory consumption.
closure = { _ in }
}
}
closure(0)
}
while true {
test()
}
如果你运行它,它的内存消耗是平稳的。
如果您在基本情况下注释掉 resets 的行closure
,它的内存消耗会无限增长。
推荐阅读
- html - 如果段落从标题开始,如何对齐段落的下一行
- java - 扫描多个输入时没有此类元素异常
- mysql - 我可以在 MySQL 表上对字符串使用 ON UPDATE - VARCHAR 列吗
- css - 不依赖 JavaScript 的 Bootstrap CDN 的 WordPress 后备?
- azure - 在 MacOS 上使用 sourcetree 连接到 Azure devops 存储库
- javascript - 修改对象后如何获取文本对象字体大小
- google-api - Google My Business API 中的 account_name 是什么?
- c# - XAML 到高质量位图
- sap-query - 选择后 SAP 信息集查询修改表
- regex - 正则表达式:第二组匹配太多