EXC_BAD_ACCESS“试图在`deinit`中保留deallocated对象”

时间:2015-06-18 16:44:26

标签: ios swift

以下代码段在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    

0 个答案:

没有答案