Swift 面试:ARC 与内存管理源码解析
Swift 面试:ARC 与内存管理源码解析 Swift 面试里问 ARC,通常不是想听一句“自动引用计数”。真正要答清楚的是:对象头里有什么、strong / weak / unowned 到底差在哪里、编译器什么时候插入或消除 retain/release、为什么闭包会循环引用。 这篇文章按面试题展开。先给可以直接回答的版本,再把结论落到 Swift 源码里的对象布局、引用计数状态机和 SIL ARC 优化。 面试高频问题 Swift 的 ARC 和 Objective-C 的 ARC 有什么区别? Swift 对象的引用计数存在哪里? strong、weak、unowned 的底层差异是什么? 为什么 weak 在对象释放后会自动变成 nil? 为什么 unowned 访问已释放对象会崩溃? 闭包为什么容易造成循环引用? 编译器会如何优化 retain/release? 值类型是否完全不参与 ARC? ARC 和 Copy-on-Write 有什么关系? 30 秒回答版 Swift ARC 是编译器和运行时共同完成的内存管理机制。 编译器在 SIL 阶段根据所有权语义插入 retain_value、release_value、strong_retain、strong_release 等引用计数指令,并通过 ARC 优化尽量消除冗余 retain/release。运行时负责真正维护对象的引用计数。 对原生 Swift 堆对象来说,对象头包含两部分:metadata 和 refCounts。源码里 HeapObject 的注释明确说 metadata 总是指向一个有效的 metadata 对象,refCounts 是 Swift heap object header 的非 Objective-C 成员。 ...