通过在另一个闭包中调用swift闭包引起的堆栈溢出

时间:2015-05-13 04:44:01

标签: ios macos swift closures stack-overflow

更新:此错误由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"无限地并最终溢出堆栈。

你能否解释为什么在另一个内部调用一个闭包会导致这个错误?

感谢。

1 个答案:

答案 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的一些编译器错误。