以下是您可以在游乐场中运行的代码示例
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
它说明了为具有潜在保留周期的块分配值的3种方法。由于1.
,案例2.
和unowned self
不会创建保留周期,但如果3.
似乎没有办法打破保留周期(deinit
是从未打印过)。如您所见,我甚至尝试创建一个本地无主参考。
这是期望的行为吗?是吗?#34;设计"?或者我错过了什么?
谢谢!
交叉发布答案 0 :(得分:5)
是的,这是设计行为。
在不调用方法的情况下访问方法(如s.tempHandler
)等同于{ x in s.tempHandler(x) }
之类的闭包表达式。此处s
未标记为unowned
或weak
,因此会被闭包保留。如果您希望将其捕获为unowned
或weak
,则必须明确写出闭包。