Swift在“无主(安全)”和“无主(不安全)”之间有什么区别?

时间:2014-10-24 18:19:34

标签: memory-management swift automatic-ref-counting

除了unowned(safe)unowned(unsafe)之外,Apple的Swift Programming Language Guide还提到捕获说明符 weakunowned

我(我想)理解weakunowned之间的差异;但是unowned(safe)unowned(unsafe)之间有什么区别?指南不说。


请:不要只依赖于说明Objective-C等同物。

4 个答案:

答案 0 :(得分:28)

据我所知,虽然我找不到Apple的权威来源,unowned可以分为两种,safeunsafe

unownedunowned(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)

一个简单的定义。这将清除混乱。

- 无主属性:如果在取消分配引用的实例后尝试访问无主引用,则程序将崩溃。

- 无主(不安全)属性:如果在取消分配引用的实例后尝试访问不安全的无主引用,程序将尝试访问实例所在的内存位置,这是不安全的操作。 (不保证这会执行或崩溃)