苹果的Swift Programming Language Guide除了unowned(safe)
和unowned(unsafe)
之外,还提到了捕获说明weak
和unowned
。
我(认为我)了解weak
和unowned
之间的区别;但是unowned(safe)
和unowned(unsafe)
有什么区别?指南没有说。
请:不要仅仅依靠陈述一个Objective-C的对等物。
最佳答案
据我了解,尽管我找不到苹果的确切信息,但unowned
可以分为两种类型:safe
和unsafe
。
裸unowned
是unowned(safe)
:它是特殊包装的引用,当引用已取消分配的实例时,它将引发异常。
特殊情况是unowned(unsafe)
:它与Objective C的@property (assign)
或__unsafe_unretained
的Swift等效。它不应该在Swift程序中使用,因为它的目的是桥接到用Objective C编写的代码。
因此,在查看Cocoa类的导入包装器时会看到unowned(unsafe)
,但除非必须使用它,否则不要使用它,并且会知道何时需要使用它。
更新__unsafe_unretained
是一个简单的指针。它不会知道所指向的实例何时被取消分配,因此在取消引用时,基础内存可能是垃圾。
如果存在使用已分配的__unsafe_unretained
变量的缺陷,您将看到不稳定的行为。有时足够的内存位置足以使代码运行,有时它将被部分覆盖,因此您会遇到非常奇怪的崩溃,并且有时该内存位置将包含一个新对象,因此您将获得无法识别的选择器异常。
Transitioning to ARC Release Notes