**ARC(自动引用计数)**通过在编译期跟踪强引用来管理类实例的内存:编译器会插入 retain/release 调用,当一个对象的强引用计数归零时,它会被立即释放——是确定性的,而不是由后台垃圾回收器完成。
nil。必须是 var 且为 optional。unowned(unsafe) 会导致未定义行为)。final class Customer {
var card: Card? // strong: customer owns card
}
final class Card {
unowned let owner: Customer // unowned: card never outlives its owner
init(owner: Customer) { self.owner = owner }
}
按生命周期关系选择,而不是凭习惯:
| weak | unowned | |
|---|---|---|
| Optional | 是(会变为 nil) | 否 |
| ARC 成本 | 略高(需跟踪) | 较低 |
| 另一对象消失时是否安全 | 安全 | 崩溃 |
| 使用场景 | 该引用可以合理地变为 nil(delegate、可能先释放的父对象) | 该引用保证比 self 活得更久(子对象 → 必存在的父对象) |
! 标记会标出循环。deinit 日志——最快的健全性检查:如果关闭一个屏幕时 deinit 从未打印,那个对象就泄漏了。deinit { print("released \(Self.self)") } // silence on dismiss = leak
捕获 self 的逃逸闭包、父子间双向的强引用、Timer/DispatchSourceTimer 持有其 target,以及未存储在会被释放的 cancellable 中的 Combine 订阅。
ARC 是确定性的,所以泄漏是你的责任,而不是 GC 的——一个被保留的 view controller 就能钉住数兆字节的图片以及它整个对象图。资深面试会探究这一点,因为正确地在 weak 与 unowned 之间选择、并知道如何用内存图证明泄漏,正是让长时间运行的 app 不至于内存膨胀的关键。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠