Swift 强引用、弱引用、无主引用
[Objective-C 属性特性]
ARC
- 自动引用计数
是一种管理内存的机制,适用于引用类型
[关于]。只有当对象的引用计数为0时,该对象才会被释放。
强引用
- 默认设置,并且在线性关系(没有循环)中使用这种类型是安全的。
保留环
- 当每个对象都对彼此有强引用时,就会出现这种情况。
打破一个保留环
:使用弱引用
和无主引用
。它们都不会使对象的引用计数增加+1
,并且有以下区别。
弱引用
- 当一个被引用的对象被释放(变为nil
),ARC
也会将 weak
引用设置为 nil
。这就是为什么 weak
引用是一个变量 var
(不能是常量 let
)[var vs let],也是一个可选项 optional
weak var delegate: <Type>?
常规
unowned
- 当引用的对象被释放(即为nil
)时,unowned
不会 变成nil
,因为ARC
不会设置它。这就是为什么unowned
引用是非可选的
默认情况下为unowned
safe unowned
- 使用运行时安全检查
来抛出异常,如果unowned
引用已被释放。
Fatal error: Attempted to read an unowned reference but object 0x7fa5dad3f0f0 was already deallocated
unowned(unsafe)
unowned(unsafe)
通过 UnsafePointer
操作,可以创建一个 dangling pointer
。它类似于 Objective-C
中的 __unsafe_unretained
。这是一种直接内存访问方式,ARC
无法处理。它可能会产生意外的行为,而不仅仅是崩溃。它具有更好的性能。
EXC_BAD_ACCESS
[EXC_BAD_ACCESS]
[Closure示例]