微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

更新:此错误由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()方法,它将无限地打印“in closure 2”并最终溢出堆栈.

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

谢谢.

解决方法

将您的代码更改为此,它将起作用

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")
    }
}

看来你在函数中声明[弱自我],它会导致问题.

我也试试这个来打电话

let c = ClosureStackOverflow()
    c.call()

它会输出

in closure 1
in closure 2
deinit

如果你不使用弱自我,它似乎不会导致循环引用

除了
我也测试将功能更改为此

func call() {
    callClosure1 {
        [weak self] in
        self!.callClosure2 {
            self?.b = true
        }
    }
}

它也会起作用.所以我认为这可能是swift的一些编译器错误.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐