Swift ARC和块

我正在尝试一个简单的例子,如下所示: 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中)

dispatch_async(dispatch_get_main_queue()) { [unowned self] in println(self) } 

我不明白为什么它在我运行专业版时会崩溃

  • 线程#1:tid = 0x1a796,0x00284d18 libswiftCore.dylib`_swift_release_slow + 8,queue =’com.apple.main-thread’,stop reason = EXC_BAD_ACCESS(code = 1,address = 0x458bc681)

在最新的测试版(5)上有什么变化,这是不再支持的吗? 谢谢

编辑:有趣的是这段代码适用于Objc

 __weak MyViewController *weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%@", weakSelf); }); 

edit2:关于这个链接的解释: 我们总是在Swift中使用[unowned self]内部关闭弱和无主的区别是错误的。

这不仅仅是弱小的,而且没有。 如果是这种情况,这也应该崩溃:

  dispatch_async(dispatch_get_main_queue()) { [weak self] in println(self) } 

但它没有,它打印指针,所以,它不是零。

[Unowned self]使得闭包不会创建对self的强引用,如果它也被解除分配,它也不会自动将其设置为nil 。 执行异步方法时,已取消分配self。 这就是你遇到崩溃的原因。

在一次性异步调用中使用unowned当然没有意义。 最好是捕获一个强有力的参考,以确保它坚持下去。 仍然没有强大的参考周期,因为self不拥有闭包。

附注:这不能是您的所有代码,因为在代码中的任何位置都没有定义self

unowned weak是两件不同的事情。 在Objective-C中, unowned被称为unsafe unretained 。 您可以在两种语言中使用weakweak表示如果取消分配对象,运行时将自动将引用转换为nilunownedunsafe unretained意味着它不会被设置为nil (这就是为什么它在Objective-C中被称为“不安全”)。

只有在永远不会释放对象的情况下才能使用无主。 在这种情况下,使用weak

请记住,如果您在Swift中捕获变量为weak ,则引用将变为可选,因此要使用它,您必须打开它:

 dispatch_async(dispatch_get_main_queue()) { [weak self] in if let actualSelf == self { // do something with actualSelf } // you can still print the "wrapped" self because it is fine to print optionals // even if they are `nil` println(self) } 

但要明确的是,在这种情况下使用强引用仍然是最好的:

 dispatch_async(dispatch_get_main_queue()) { println(self) }