更新:此错误由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 举报,一经查实,本站将立刻删除。