# 老司机 iOS 周报 #321 | 2025-01-20

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/weekly-header/321.jpg?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

这就是春节前最后一期周报啦，下周老司机编辑部也会开始春节假期，提前祝大家新春快乐！

## 文章

### 🌟 🐎 [探究 SwiftUI Preview 的工作原理](https://onee.me/zh/blog/how-new-xcode-swiftui-preview-works-under-the-hood/)

[@JonyFang](https://github.com/jonyfang): 在 SwiftUI 开发中，Xcode Preview 常出现崩溃或卡死问题，如果不了解其工作原理，通常只能用清除缓存、重启 Xcode 等方法解决。作者通过将 DerivedData 文件夹加入 Git 管理，观察其变化来研究 Preview 原理。其运行机制上，Xcode 16 起 Build and Run 与 Preview 共享构建产物，Preview 用 JIT 方式运行且有特殊预处理过程。Preview 有 Small、Middle、Large 三种重构建策略，依源代码修改程度决定范围与刷新方式。与 Flutter 的 Hot Reload 相比 Xcode Preview 的表现逊色，不支持断点调试，视图状态会重置，实现更黑盒，但仍期待 Xcode 后续对 Preview 优化。

### 🐢 [Using Copilot to write a raindrop audio synthesizer using AVAudioEngine](https://www.cocoawithlove.com/blog/copilot-raindrop-generator.html)

[@EyreFree](https://github.com/EyreFree)：本文分享了作者使用 GitHub Copilot 开发一个用 AVAudioEngine 实现的雨滴音频合成器的经历。文章评估了 Copilot 在实际开发中的优缺点：

优点：
1. 在处理不熟悉的 SDK 时能快速提供解决方案；
2. 能实现复杂算法（如粉噪音生成）；
3. 擅长跨语言代码转换（如 C++ 到 Swift）且基本不会产生语法错误。

缺点：
1. 代码质量欠佳，存在大量重复和不必要的抽象，常忽略指令的部分要求；
2. 对最新的语言特性支持不足，线程安全处理不当；
3. 手动修改代码后容易与 Copilot 聊天上下文不同步。

使用 Copilot 就像在指导一个热情但经验不足的新手程序员，虽然在某些场景下能提高效率，但需要权衡使用 Copilot 编写代码与手动修复其产生的问题之间的时间成本，因为和 Copilot 的交互是「一次性」的，AI 并不会真的累积这些进步。


### 🐎 [Creating interactive tutorials using DocC](https://www.nutrient.io/blog/creating-interactive-tutorials-using-docc/)

[@Kyle-Ye](https://github.com/Kyle-Ye): 文章介绍了如何使用 DocC 创建交互式教程。通过 DocC，可以将静态的文档内容转变为交互式的体验，允许用户在文档中点击、操作，并快速找到他们所需的信息。此外，文章还展示了如何集成代码示例、自定义预览图片和课后小测，提供了更具互动性和可操作性的开发者学习体验。

### 🐎 [Creating a SwiftUI text view with tappable links](https://danielsaidi.com/blog/2024/12/18/creating-a-swiftui-text-view-with-tappable-links)

[@Bluesjiang](https://github.com/bluesjiang): 文章介绍了一种在 SwiftUI 中实现可点击超链接效果的文本。因为 SwiftUI 原生没有提供对应中间。文章的作者很巧妙的利用了 SwiftUI 中 `Text` 支持 Markdown 的渲染来实现这一效果。作者还简单编写了一个组件来帮你快捷的构建 Markdown 超链接的内容。比较适合刚入门 SwiftUI 的同学实践自定义 UI。

### 🐕 [Size Matters: An Exploration of Virtual Memory on iOS](https://alwaysprocessing.blog/2022/02/20/size-matters)

[@阿权](https://github.com/bqlin)：文章作者发现开启扩展虚拟内存（Extended Virtual Addressing）能够解决调试 App OOM 的问题。文中详细介绍了以下内容：

1. 虚拟内存的原理、作用；
2. iOS 中虚拟内存：
   1. iOS 虚拟内存的特殊性：No Page Outs；
   2. iOS 虚拟内存空间大小的计算方式；
   3. iOS 不同设备进程可用的虚拟地址空间大小；
   4. 调试 App 出现 OOM 的原因：除了程序自身的 Mach-O、依赖库占用内存，还需为调试环境预留内存；
   5. 通过开启扩展虚拟内存（Extended Virtual Addressing）来防止调试出现 OOM。

文章遇到的情况在许多大型项目跑在低端设备上都会经常出现，了解虚拟内存对调试开发都很有帮助。

### 🐢 [Type-Driven Design with Swift](https://swiftology.io/collections/type-driven-design/)

[@DylanYang](https://github.com/Dylan19Yang)：作者通过一系列文章向我们介绍了类型驱动设计的概念。类型驱动设计的核心是通过类型自身来传递更多信息，一个非空类型比一个 Optional 类型包含了更多信息（非空），一个自定义的 Email 类型可以比单纯的 String 包含更多信息，例如在一个 Email 结构的初始化中校验 String 的格式是否正确，通过传递 Email 类型而不是 String 来保留这份格式校验的信息。以此类推，把更多的逻辑通过自定义类型封装起来，通过巧妙的设计类型来抹除原本可能出现的错误状态，然后在类型和类型之间通过领域化来划分、拆解，使得整个设计思路更清晰。本系列通过丰富的 demo 对类型驱动设计这一概念有较深入的阐释，感兴趣的读者可以花时间阅读下这个系列。

## 代码

### 🐎 [echarts](https://echarts.apache.org/examples/zh/index.html#chart-type-line)

[@极速男孩](https://github.com/ztlyyznf001): ECharts 是一个开源的可视化库，广泛用于创建交互式图表。线性图表常用于表示数据趋势，X 轴通常为时间或类别，Y 轴为数值。ECharts 支持多条数据线展示、交互式操作（如悬停显示数据），并可高度自定义图表样式，如颜色、线条类型、动画等。用户通过 JSON 配置来定义图表内容，适用于销售、气温等多种数据展示。

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2024」，领取 2024 及往年内参**

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
