- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
更新:此错误已由 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/
我在一个简单的 GTK 应用程序中有两个小部件: extern crate gdk; extern crate gtk; use super::desktop_entry::DesktopEntry;
我想做这样的事情: const vegetableColors = {corn: 'yellow', peas: 'green'}; const {*} = vegetableColors; cons
该属性它存储在 gradle 中的什么位置? subprojects { println it.class.name // DefaultProject_Decorated depen
我想在 jQuery 闭包中看到窗口属性“otherName”描述符。但 进入 jQuery 闭包 'otherName' 描述符显示未定义,我认为可能 是 getOwnPropertyDescrip
我曾经看过 Douglas Crockford 的一次演讲,在 javascript 的上下文中,他提到将 secret 存储在闭包中可能很有用。 我想这可以在 Java 中像这样天真地实现: pub
我很难理解 Swift 中闭包中真正发生的事情,希望有人能帮助我理解。 class MyClass { func printWhatever(words: String) {
我有两个 3 表:用户、个人资料、friend_request $my_profile_id变量存储用户个人资料ID的值 $my_user_id = Auth::user()->id; $my_pro
我正在尝试通过使用 GLFW 的包装来学习 Swift GLFW 允许添加错误回调: GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cb
我是一名优秀的程序员,十分优秀!