gpt4 book ai didi

ios - 闭包递归和保留循环

转载 作者:搜寻专家 更新时间:2023-11-01 06:26:44 26 4
gpt4 key购买 nike

我的关闭保留了自己。它会导致捕获内部的所有其他对象。我可以使用弱引用传递这样的对象,但它并没有解决保留循环的问题。在没有保留循环的情况下使用闭包进行递归的正确方法是什么?

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()
}

如果你运行它,它的内存消耗是平的。

如果您注释掉重置 closure 的基本情况中的行,它的内存消耗会无限增长。

关于ios - 闭包递归和保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53307534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com