我正在尝试一个简单的示例,如下所示:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-XID_88
以下是我的代码。(忽略其他可能存在的代码,此处是在空的UIViewcontroller的viewDidLoad中编写的)
我不明白为什么在运行该程序时会崩溃。
编辑: 有趣的是,这段代码在Objc上可以工作。
但实际上,它并没有打印 nil ,而是打印了指针,因此它并不是 nil。
dispatch_async(dispatch_get_main_queue()) {
[unowned self] in
println(self)
}
我不明白为什么在运行该程序时会崩溃。
最新的beta(5)有什么变化导致这个程序不再受支持吗? 谢谢。
- 线程#1:tid=0x1a796,0x00284d18 libswiftCore.dylib`_swift_release_slow + 8,队列= 'com.apple.main-thread',停止原因=EXC_BAD_ACCESS(code=1, address=0x458bc681)
编辑: 有趣的是,这段代码在Objc上可以工作。
__weak MyViewController *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", weakSelf);
});
编辑2: 这个链接上的解释:Shall we always use [unowned self] inside closure in Swift 关于weak和unowned的区别是错误的。
不仅仅是weak会变成nil,而unowned则不会。如果是那样的话,这个也应该会崩溃:
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
println(self)
}
但实际上,它并没有打印 nil ,而是打印了指针,因此它并不是 nil。
nil
或类似的内容。unowned
的意思是“我保证它不会是 nil,如果是,就让我崩溃。”而weak
的意思是“它是可选项,所以nil
是可以接受的。” - Rob Napier