<?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>Swift 面试源码系列 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/</link><description>Recent content in Swift 面试源码系列 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/posts/swiftinterviewsourcecode/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><item><title>Swift 面试：泛型、协议与派发源码解析</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/generics-protocol-dispatch/</link><pubDate>Tue, 16 Jun 2026 09:06:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/generics-protocol-dispatch/</guid><description>&lt;h1 id="swift-面试泛型协议与派发源码解析"&gt;Swift 面试：泛型、协议与派发源码解析&lt;/h1&gt;
&lt;p&gt;Swift 面试里，泛型和协议经常不是单独问语法，而是连着问：&lt;strong&gt;Swift 中函数派发机制有哪几种？泛型是编译期还是运行期机制？协议调用为什么可能慢？&lt;code&gt;some&lt;/code&gt; 和 &lt;code&gt;any&lt;/code&gt; 为什么性能不同？Protocol Witness Table 到底是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章按面试题展开，把答案落到 Swift 编译器里的 Generic Signature、Generic Specializer、SIL 调用指令、Protocol Witness Table、class vtable 和 Devirtualize 优化。&lt;/p&gt;
&lt;h2 id="面试高频问题"&gt;面试高频问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Swift 中函数派发机制有哪几种？&lt;/li&gt;
&lt;li&gt;直接派发、class vtable 派发、witness table 派发、Objective-C 消息派发分别适用于什么场景？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function_ref&lt;/code&gt;、&lt;code&gt;class_method&lt;/code&gt;、&lt;code&gt;witness_method&lt;/code&gt;、&lt;code&gt;objc_method&lt;/code&gt; 在 SIL 里分别代表什么？&lt;/li&gt;
&lt;li&gt;如何用 &lt;code&gt;swiftc -emit-silgen&lt;/code&gt; / &lt;code&gt;swiftc -emit-sil -O&lt;/code&gt; 观察派发指令？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dynamic&lt;/code&gt; / &lt;code&gt;@objc dynamic&lt;/code&gt; 会怎样影响派发？&lt;/li&gt;
&lt;li&gt;如何用代码对比泛型、&lt;code&gt;some&lt;/code&gt;、&lt;code&gt;any&lt;/code&gt; 的派发和性能差异？&lt;/li&gt;
&lt;li&gt;Swift 泛型是运行时泛型还是编译期泛型？&lt;/li&gt;
&lt;li&gt;Generic Signature 是什么？它保存哪些信息？&lt;/li&gt;
&lt;li&gt;泛型特化为什么能提升性能？&lt;/li&gt;
&lt;li&gt;Protocol Witness Table 是什么？&lt;/li&gt;
&lt;li&gt;协议方法调用什么时候是静态派发，什么时候是动态派发？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;some Protocol&lt;/code&gt; 和 &lt;code&gt;any Protocol&lt;/code&gt; 的本质区别是什么？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;final&lt;/code&gt;、&lt;code&gt;private&lt;/code&gt;、具体类型为什么有利于优化？&lt;/li&gt;
&lt;li&gt;协议扩展里的方法一定是动态派发吗？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;class_method&lt;/code&gt; 和 &lt;code&gt;witness_method&lt;/code&gt; 有什么区别？&lt;/li&gt;
&lt;li&gt;面试里如何解释“Swift 既强调协议，又强调性能”？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="30-秒回答版"&gt;30 秒回答版&lt;/h2&gt;
&lt;p&gt;Swift 函数派发面试不要只答“静态派发和动态派发”。更完整的分类是：&lt;strong&gt;直接派发&lt;/strong&gt;、&lt;strong&gt;class vtable 派发&lt;/strong&gt;、&lt;strong&gt;protocol witness table 派发&lt;/strong&gt;、&lt;strong&gt;Objective-C 消息派发&lt;/strong&gt;，再补充优化器可能把动态调用去虚拟化成直接调用。&lt;/p&gt;</description></item><item><title>Swift 面试：值语义、COW 与集合源码解析</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/value-semantics-cow-collections/</link><pubDate>Tue, 16 Jun 2026 09:06:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/value-semantics-cow-collections/</guid><description>&lt;h1 id="swift-面试值语义cow-与集合源码解析"&gt;Swift 面试：值语义、COW 与集合源码解析&lt;/h1&gt;
&lt;p&gt;Swift 的 &lt;code&gt;Array&lt;/code&gt;、&lt;code&gt;String&lt;/code&gt;、&lt;code&gt;Dictionary&lt;/code&gt; 都表现为值类型，但它们不可能每次赋值都完整复制底层存储。面试官问值语义和 COW，真正想看的是你能不能说清楚：&lt;strong&gt;值语义是语言语义，COW 是性能实现；集合表面是 struct，底层经常共享引用存储；写入前靠唯一性检查决定是否复制。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章从面试题出发，把结论落到 Swift 标准库源码里的 Array buffer、String guts、Dictionary storage 和 &lt;code&gt;isKnownUniquelyReferenced&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="面试高频问题"&gt;面试高频问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Swift 的 struct 为什么常说是值语义？&lt;/li&gt;
&lt;li&gt;Array 赋值时一定会复制底层元素吗？&lt;/li&gt;
&lt;li&gt;Copy-on-Write 的触发条件是什么？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isKnownUniquelyReferenced&lt;/code&gt; 检查的到底是什么？&lt;/li&gt;
&lt;li&gt;Array、ContiguousArray、ArrayBuffer、Storage 是什么关系？&lt;/li&gt;
&lt;li&gt;String 为什么不能用整数下标随机访问？&lt;/li&gt;
&lt;li&gt;String.Index 为什么不是一个简单的 Int？&lt;/li&gt;
&lt;li&gt;Dictionary 也是 COW 吗？&lt;/li&gt;
&lt;li&gt;ArraySlice 为什么可能持有原数组存储？&lt;/li&gt;
&lt;li&gt;值类型里包含 class 引用，还算值语义吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="30-秒回答版"&gt;30 秒回答版&lt;/h2&gt;
&lt;p&gt;Swift 的值语义是说：从语言使用者角度看，赋值、传参、修改不会意外影响另一个值。但这不等于底层每次都立即复制。&lt;/p&gt;
&lt;p&gt;标准库集合通常用 Copy-on-Write 实现：多个值可以共享同一份堆上 buffer；只有当某个值要写入时，才检查底层 buffer 是否唯一引用。如果唯一，就原地修改；如果不唯一，就复制一份新 buffer 再修改。&lt;/p&gt;
&lt;p&gt;所以：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;值语义：用户看到的是独立值
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;COW：实现上先共享，写入前再判断是否复制
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ARC：维护底层 buffer 的引用计数
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isUnique：让 COW 判断能否原地修改
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;面试可以这样回答：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Swift 的 Array 是 struct，但它内部持有引用语义的 storage。赋值时通常只复制结构体里的引用；真正写入时通过唯一性检查决定是否复制底层 storage。这让 Array 同时具备值语义和接近引用共享的性能。&lt;/p&gt;</description></item><item><title>Swift 面试：并发、async/await 与 Actor 源码解析</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/concurrency-actor-async/</link><pubDate>Tue, 16 Jun 2026 09:06:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/concurrency-actor-async/</guid><description>&lt;h1 id="swift-面试并发asyncawait-与-actor-源码解析"&gt;Swift 面试：并发、async/await 与 Actor 源码解析&lt;/h1&gt;
&lt;p&gt;Swift Concurrency 面试经常从 &lt;code&gt;async/await&lt;/code&gt; 问起，但真正的重点是：&lt;strong&gt;Task 是结构化并发的执行单元，await 是显式暂停点，Actor 通过隔离和串行执行器保护状态，Sendable 则约束跨并发边界传递的数据。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章按面试题展开，把结论落到 Swift 标准库和编译器源码里的 Actor、GlobalActor、MainActor、AsyncLet、TaskGroup、Sendable 和 ActorIsolation。&lt;/p&gt;
&lt;h2 id="面试高频问题"&gt;面试高频问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;async/await 和 GCD 的关系是什么？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;await&lt;/code&gt; 到底表示线程阻塞还是任务暂停？&lt;/li&gt;
&lt;li&gt;Task、async let、TaskGroup 有什么区别？&lt;/li&gt;
&lt;li&gt;Actor 如何保证数据隔离？&lt;/li&gt;
&lt;li&gt;MainActor 是什么，为什么 UI 更新要回到 MainActor？&lt;/li&gt;
&lt;li&gt;GlobalActor 和普通 Actor 有什么区别？&lt;/li&gt;
&lt;li&gt;Sendable 解决什么问题？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Task.detached&lt;/code&gt; 为什么要慎用？&lt;/li&gt;
&lt;li&gt;Actor 之间调用为什么需要 &lt;code&gt;await&lt;/code&gt;？&lt;/li&gt;
&lt;li&gt;Swift Concurrency 是编译器机制还是运行时机制？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="30-秒回答版"&gt;30 秒回答版&lt;/h2&gt;
&lt;p&gt;Swift Concurrency 是编译器、标准库和运行时共同完成的并发模型。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;async/await&lt;/code&gt; 不是对 GCD 的简单语法糖。&lt;code&gt;await&lt;/code&gt; 表示当前异步任务可能在这里暂停，把执行权交还给调度器；等异步结果可用时，再从 continuation 恢复。它不应该理解成“阻塞当前线程等待”。&lt;/p&gt;
&lt;p&gt;Actor 是一种受隔离保护的引用类型。Actor 内部可变状态只能在 actor 隔离域内访问；跨 actor 访问必须异步，编译器会插入隔离检查。运行时通过 executor 保证同一 actor 的隔离状态不会被多个任务同时进入。&lt;/p&gt;</description></item><item><title>Swift 面试：编译流程、Runtime 与元数据源码解析</title><link>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/compiler-runtime/</link><pubDate>Tue, 16 Jun 2026 09:06:27 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/swiftinterviewsourcecode/compiler-runtime/</guid><description>&lt;h1 id="swift-面试编译流程runtime-与元数据源码解析"&gt;Swift 面试：编译流程、Runtime 与元数据源码解析&lt;/h1&gt;
&lt;p&gt;Swift 面试里问编译流程和 Runtime，通常不是想听一串名词，而是想看你能不能把 &lt;strong&gt;源码 -&amp;gt; AST -&amp;gt; SIL -&amp;gt; 优化 -&amp;gt; IRGen -&amp;gt; LLVM -&amp;gt; Runtime Metadata&lt;/strong&gt; 串起来。&lt;/p&gt;
&lt;p&gt;这篇文章按面试题展开，把答案落到 Swift 编译器源码里的 SILGen、SILOptimizer、IRGen、Metadata、Value Witness Table、Protocol Witness Table 和 HeapObject。&lt;/p&gt;
&lt;h2 id="面试高频问题"&gt;面试高频问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Swift 源码从 &lt;code&gt;.swift&lt;/code&gt; 到机器码经历哪些阶段？&lt;/li&gt;
&lt;li&gt;AST、SIL、LLVM IR 分别负责什么？&lt;/li&gt;
&lt;li&gt;为什么 Swift 需要 SIL，而不是直接生成 LLVM IR？&lt;/li&gt;
&lt;li&gt;SILGen 做什么？SILOptimizer 做什么？&lt;/li&gt;
&lt;li&gt;IRGen 为什么要生成 Metadata 和 Witness Table？&lt;/li&gt;
&lt;li&gt;Swift Runtime Metadata 保存了哪些信息？&lt;/li&gt;
&lt;li&gt;Value Witness Table 是什么？&lt;/li&gt;
&lt;li&gt;Protocol Witness Table 和 class vtable 有什么区别？&lt;/li&gt;
&lt;li&gt;class、struct、enum 在 Runtime 表示上有什么差异？&lt;/li&gt;
&lt;li&gt;HeapObject 和 Metadata 有什么关系？&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="30-秒回答版"&gt;30 秒回答版&lt;/h2&gt;
&lt;p&gt;Swift 编译流程可以简化为：&lt;/p&gt;</description></item></channel></rss>