我(认为我)了解弱者和不了解者之间的差异;但不知道(安全)和未知(不安全)之间有什么区别?指南没有说。
请:不要简单地说明一个Objective-C的等价物。
一个裸体是未知的(安全的):它是一个特别包装的引用,当引用一个经过实例化的实例时,它将抛出一个异常。
特殊情况是未知的(不安全的):它是Swift等同于Objective C的@property(assign)或__unsafe_unretained。它不应该在Swift程序中使用,因为它的目的是桥接到Objective C中编写的代码。
所以,当您查看Cocoa类的导入包装器时,您将看到unowned(不安全),除非您必须使用它,否则不要使用它,并且您将知道何时必须。
更新
__unsafe_unretained是一个简单的指针。它不知道什么时候被指向的实例已经被处理,所以当它被取消引用时,底层内存可能是垃圾。
如果您有一个缺陷,其中正在使用已经执行的__unsafe_unretained变量,那么您将看到不正常的行为。有时足够的内存位置足够好,所以代码将运行,有时它会被部分覆盖,所以你会得到非常奇怪的崩溃,有时内存位置将包含一个新的对象,所以你将得到无法识别的选择器异常。
Transitioning to ARC Release Notes
__unsafe_unretained
specifies a reference that does not keep the referenced object alive and is not set to nil when there are no strong references to the object. If the object it references is deallocated,the pointer is left dangling.