gpt4 book ai didi

ios - 在另一个闭包中调用一个swift闭包导致的栈溢出

转载 作者:搜寻专家 更新时间:2023-10-31 08:05:15 27 4
gpt4 key购买 nike

更新:此错误已由 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")
}
}

看来你在函数中声明了[weak self] in,这导致了问题。

我也测试了这个调用

 let c = ClosureStackOverflow()
c.call()

会输出

 in closure 1
in closure 2
deinit

不使用weak self好像不会引起循环引用

此外我也测试把函数改成这个

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

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

关于ios - 在另一个闭包中调用一个swift闭包导致的栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30205862/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com