以下代码段在deinit
中使用EXC_BAD_ACCESS失败,之前在方法_swift_abortRetainUnowned
中使用EXC_BREAKPOINT,并显示消息“尝试保留已解除分配的对象”。
我想知道为什么导出的self
在被捕获为unowned
时将被保留 - 并且即使闭包被明确声明为@noescape
。恕我直言,自我进入封闭时不应保留在这里。
相反,当self
被捕获为强引用时,代码会成功。如果是相反的话我会理解的。我缺少什么?
import Foundation
public class Bar {
private let _id = 1
func foo(@noescape f: ()->()) -> () {
f()
}
deinit {
foo() { [unowned self] in
let id = self._id
}
}
}
func test() ->() {
var cr = Bar()
}
test()
堆栈:
UnownedSelf`_swift_abortRetainUnowned:
0x100174d90 <+0>: leaq 0x1979d(%rip), %rax ; "attempted to retain deallocated object"
0x100174d97 <+7>: movq %rax, 0x65ff2(%rip) ; gCRAnnotations + 8
0x100174d9e <+14>: int3
-> 0x100174d9f <+15>: nop