除了unowned(safe)
和unowned(unsafe)
之外,Apple的Swift Programming Language Guide还提到捕获说明符 weak
和unowned
。
我(我想)理解weak
和unowned
之间的差异;但是unowned(safe)
和unowned(unsafe)
之间有什么区别?指南不说。
请:不要只依赖于说明Objective-C等同物。
答案 0 :(得分:28)
据我所知,虽然我找不到Apple的权威来源,unowned
可以分为两种,safe
和unsafe
。
裸unowned
是unowned(safe)
:它是一个特殊包装的引用,它会在引用dealloced实例时抛出异常。
特殊情况为unowned(unsafe)
:它与目标C的@property (assign)
或__unsafe_unretained
相当。它不应该在Swift程序中使用,因为它的目的是桥接用Objective C编写的代码。
因此,在查看Cocoa类的导入包装时,您将看到unowned(unsafe)
,但除非必须,否则不要使用它,并且您将知道何时需要。
<强>更新强>
__unsafe_unretained
是一个简单的指针。它不知道被指向的实例何时被释放,所以当它被解除引用时,底层内存可能是垃圾。
如果您有使用已解除分配的__unsafe_unretained
变量的缺陷,您将看到不稳定的行为。有时候足够的内存位置足以让代码运行,有时它会被部分覆盖,所以你会得到非常奇怪的崩溃,有时候内存位置会包含一个新对象,所以你会得到无法识别的选择器异常。
Transitioning to ARC Release Notes
__unsafe_unretained
指定一个引用,它不会使引用的对象保持活动状态,并且在没有对该对象的强引用时不会设置为nil。如果它引用的对象被释放,则指针悬空。
答案 1 :(得分:17)
以下是Apple Developer Forums的引用:
unowned
vs unowned(safe)
vs unowned(unsafe)
unowned(safe)
是一个非拥有的引用,在访问时断言 对象还活着。它有点像弱可选参考 每次访问时都隐含地用x!
打开。unowned(unsafe)
就像ARC中的__unsafe_unretained
一样 - 它是非拥有者 引用,但是没有运行时检查对象是否仍然存活 在访问时,悬空引用将进入垃圾记忆。unowned
目前始终是unowned(safe)
的同义词,但是 意图是它将优化到unowned(unsafe)
中的-Ofast
在禁用运行时检查时构建。
答案 2 :(得分:3)
在使用属性
取消定位时,会访问变量答案 3 :(得分:2)
一个简单的定义。这将清除混乱。
- 无主属性:如果在取消分配引用的实例后尝试访问无主引用,则程序将崩溃。
- 无主(不安全)属性:如果在取消分配引用的实例后尝试访问不安全的无主引用,程序将尝试访问实例所在的内存位置,这是不安全的操作。 (不保证这会执行或崩溃)