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

我(认为我)了解weakunowned之间的区别;但是unowned(safe)unowned(unsafe)有什么区别?指南没有说。

请:不要仅仅依靠陈述一个Objective-C的对等物。

最佳答案

据我了解,尽管我找不到苹果的确切信息,但unowned可以分为两种类型:safeunsafe

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

10-08 07:45