更新:此错误由rdar:// 20931915确认,并已在Xcode 7 beta 3中修复。
我发现在调试版本中调用另一个闭包中的swift闭包引起了一个奇怪的错误。我的Xcode是版本6.3.1和Swift版本1.2。这是代码:
import Swift
class ClosureStackOverflow {
private var b: Bool = false
private func callClosure1(callback: Void -> Void) {
println("in closure 1")
callback()
}
private func callClosure2(callback: Void -> Void) {
println("in closure 2")
callback()
}
func call() {
callClosure1 { [weak self] in
self?.callClosure2 {
self?.b = true
}
}
}
}
let c = ClosureStackOverflow()
c.call()
上面的代码汇编得很好。但是,如果你调用它的call()方法,它将打印"在闭包2"无限地并最终溢出堆栈。
你能否解释为什么在另一个内部调用一个闭包会导致这个错误?
感谢。
答案 0 :(得分:1)
将您的代码更改为此代码,它将正常工作
class ClosureStackOverflow {
private var b: Bool = false
private func callClosure1(callback: Void -> Void) {
println("in closure 1")
callback()
}
private func callClosure2(callback: Void -> Void) {
println("in closure 2")
callback()
}
func call() {
callClosure1 {
self.callClosure2 {
self.b = true
}
}
}
deinit{
print("deinit")
}
}
似乎你在函数中声明[weak self] in
,它会导致问题。
我也测试了这个来打电话
let c = ClosureStackOverflow()
c.call()
将输出
in closure 1
in closure 2
deinit
如果你不使用弱自我,它似乎不会导致循环引用
<强>除了强> 我还测试将功能更改为此
func call() {
callClosure1 {
[weak self] in
self!.callClosure2 {
self?.b = true
}
}
}
它也会起作用。所以我认为这可能是swift的一些编译器错误。