<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>内存管理 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</link><description>Recent content in 内存管理 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 16 Jun 2026 09:06:27 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>Swift 面试：ARC 与内存管理源码解析</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/arc-memory-management/</link><pubDate>Tue, 16 Jun 2026 09:06:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/arc-memory-management/</guid><description>&lt;h1 id="swift-面试arc-与内存管理源码解析"&gt;Swift 面试：ARC 与内存管理源码解析&lt;/h1&gt;
&lt;p&gt;Swift 面试里问 ARC，通常不是想听一句“自动引用计数”。真正要答清楚的是：&lt;strong&gt;对象头里有什么、strong / weak / unowned 到底差在哪里、编译器什么时候插入或消除 retain/release、为什么闭包会循环引用&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这篇文章按面试题展开。先给可以直接回答的版本，再把结论落到 Swift 源码里的对象布局、引用计数状态机和 SIL ARC 优化。&lt;/p&gt;
&lt;h2 id="面试高频问题"&gt;面试高频问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Swift 的 ARC 和 Objective-C 的 ARC 有什么区别？&lt;/li&gt;
&lt;li&gt;Swift 对象的引用计数存在哪里？&lt;/li&gt;
&lt;li&gt;strong、weak、unowned 的底层差异是什么？&lt;/li&gt;
&lt;li&gt;为什么 weak 在对象释放后会自动变成 nil？&lt;/li&gt;
&lt;li&gt;为什么 unowned 访问已释放对象会崩溃？&lt;/li&gt;
&lt;li&gt;闭包为什么容易造成循环引用？&lt;/li&gt;
&lt;li&gt;编译器会如何优化 retain/release？&lt;/li&gt;
&lt;li&gt;值类型是否完全不参与 ARC？&lt;/li&gt;
&lt;li&gt;ARC 和 Copy-on-Write 有什么关系？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="30-秒回答版"&gt;30 秒回答版&lt;/h2&gt;
&lt;p&gt;Swift ARC 是编译器和运行时共同完成的内存管理机制。&lt;/p&gt;
&lt;p&gt;编译器在 SIL 阶段根据所有权语义插入 &lt;code&gt;retain_value&lt;/code&gt;、&lt;code&gt;release_value&lt;/code&gt;、&lt;code&gt;strong_retain&lt;/code&gt;、&lt;code&gt;strong_release&lt;/code&gt; 等引用计数指令，并通过 ARC 优化尽量消除冗余 retain/release。运行时负责真正维护对象的引用计数。&lt;/p&gt;
&lt;p&gt;对原生 Swift 堆对象来说，对象头包含两部分：&lt;code&gt;metadata&lt;/code&gt; 和 &lt;code&gt;refCounts&lt;/code&gt;。源码里 &lt;code&gt;HeapObject&lt;/code&gt; 的注释明确说 &lt;code&gt;metadata&lt;/code&gt; 总是指向一个有效的 metadata 对象，&lt;code&gt;refCounts&lt;/code&gt; 是 Swift heap object header 的非 Objective-C 成员。&lt;/p&gt;</description></item></channel></rss>