【发布时间】:2014-10-04 22:46:47
【问题描述】:
这是我的代码。 (忽略其他可能的代码,这是一个空项目,这段代码写在一个空的 UIViewcontroller viewDidLoad 中)
dispatch_async(dispatch_get_main_queue()) {
[unowned self] in
println(self)
}
我不明白为什么我运行 pro 时它会崩溃
- 线程#1:tid = 0x1a796, 0x00284d18 libswiftCore.dylib`_swift_release_slow + 8, queue = 'com.apple.main-thread', 停止原因 = EXC_BAD_ACCESS (code=1, 地址=0x458bc681)
最新的 beta(5) 是否发生了变化并且不再支持? 谢谢
编辑: 有趣的是这段代码适用于 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 nils 和unowned 没有。如果是这种情况,这也应该崩溃:
dispatch_async(dispatch_get_main_queue()) {
[weak self] in
println(self)
}
但它没有,它打印指针,所以它不是 nil。
【问题讨论】:
-
来自The Swift Programming Language:“如果在释放它引用的实例后尝试访问无主引用,则会触发运行时错误。”
-
Unowned 表示 self 没有被保留,但是如果 self 被释放并使用了 unowned,那么你将会崩溃。如果它可能会被释放,则使用强或弱。
-
您最后的评论 [weak self] 应该导致崩溃是不正确的。
self在这种情况下是可选的。您应该期望上面打印nil或类似的东西。unowned的意思是“我发誓它不会是零,如果是的话,让我崩溃。”weak的意思是“它是可选的,所以nil是可以接受的。” -
@RobNapier 并不是说它不会崩溃,而是它还会打印指针值,它不是 nil。
-
" 这个链接上的解释:我们应该在 Swift 的闭包中总是使用 [unowned self] 来区分弱和无主是错误的。"怎么回事?
标签: ios swift automatic-ref-counting