Swift 闭包中的引用循环与内存管理
1. 弱引用的要求
弱引用有两个要求:
- 弱引用必须声明为 var ,而不是 let 。
- 弱引用必须声明为可选类型。
这两个要求是因为当弱引用所指向的实例被释放时,弱引用会被设置为 nil 。只有可选类型可以为 nil ,所以弱引用必须是可选的。而用 let 声明的实例不能改变,所以弱引用必须用 var 声明。
在大多数情况下,像刚刚解决的那种强引用循环是很容易避免的。例如, Vault 类用于存储资产,它持有对资产的强引用是合理的。 Asset 类被 Vault 包含,如果它需要引用其容器,这个引用应该是弱引用。当遇到两个类型相互引用时,要尝试确定哪个是关系中的“父”对象,该对象应该用强引用“拥有”另一个对象。
2. 闭包中的引用循环
有时候资产的价值会上升或下降。为了演示与闭包相关的内存管理行为,我们让 Asset 实例使用提供的闭包对其价值变化做出反应。
在 Asset 类型中,允许 value 可变,并通过执行一个类型为 (Asset) -> Void 的存储闭包来响应值的变化。以下是 Asset.swift 的代码:
超级会员免费看
订阅专栏 解锁全文
1453

被折叠的 条评论
为什么被折叠?



