【发布时间】:2016-04-04 15:03:39
【问题描述】:
在 Swift 中的捕获列表语法中似乎有一个奇怪的语法故障。如果我声明多个捕获的变量,则捕获说明符仅适用于第一个:
let closure = { [unowned x, y] in … }
现在我希望 y 是 unowned,但事实并非如此:
class Test {
var callback: (Void -> Void)?
init() {
print("init")
}
deinit {
print("deinit")
}
}
func makeScope() {
let x = Test()
let y = Test()
y.callback = { [unowned x, y] in
print(y)
}
}
makeScope()
print("done")
打印出来:
init
init
deinit
done
所以y 似乎被强烈捕获并创建了一个保留循环,防止对象被释放。是这样吗?如果是,在列表中允许“空”捕获说明符是否有意义?或者[unowned x, y]不被视为[unowned x, unowned y]有什么原因?
【问题讨论】:
标签: swift retain-cycle