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
。 您可以在两种语言中使用weak
。 weak
表示如果取消分配对象,运行时将自动将引用转换为nil
。 unowned
或unsafe 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) }