gpt4 book ai didi

swift - 在 swift 中将函数用作 block 时避免保留循环

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:20 26 4
gpt4 key购买 nike

以下是您可以在 playground 中运行的代码示例

import Foundation

class TempNotifier {
var onChange: (Int) -> Void = {t in }
var currentTemp = 72

init() {
// 1.
onChange = { [unowned self] temp in
self.currentTemp = temp
}

// 2.
onChange = {[unowned self] temp in
self.tempHandler(temp)
}

// 3.
unowned let s = self
onChange = s.tempHandler
}

deinit {
println("deinit")
}

private func tempHandler(temp: Int) {
self.currentTemp = temp
}
}

var tN: TempNotifier? = TempNotifier()
tN = nil

它说明了为具有潜在保留周期的 block 分配值的 3 种方法。案例 1.2. 由于 unowned self 而没有创建保留周期,但是在案例 3. 中似乎没有办法打破保留周期(deinit 永远不会打印)。如您所见,我什至尝试创建一个本地无主引用。

这是期望的行为吗,是“设计使然”的吗?还是我遗漏了什么?

谢谢!

交叉发布自 https://devforums.apple.com/message/1122247

最佳答案

是的,这是设计的行为。

访问方法而不调用它,如 s.tempHandler,等同于闭包表达式,如 { x in s.tempHandler(x) }。这里 s 没有被标记为 unownedweak,因此被闭包保留。如果您希望它被捕获为 unownedweak,则必须显式写出闭包。

关于swift - 在 swift 中将函数用作 block 时避免保留循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485471/

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