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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...