内容提要
本期周报以作者两次硬盘空间被 Agent 快速耗尽为例,指出 Agent 并行激进的工作方式使存储成为新瓶颈,开发者需为 Agent 划定环境边界并建立资源清理规范。推荐内容涵盖 Swift Optional 进阶用法、用 Instruments 排查 SwiftUI 重绘、iOS 27 Now Playing 框架、折叠屏布局适配、Text 插值、框架 API 无感演进及多 Agent 并行隔离;另介绍 ICP 备案例外申请与 SwiftyDMG、PreviewMD、szt 等工具。
延伸解读
Agent 并行工作流下的存储瓶颈
作者两次硬盘空间被快速耗尽,根源在于 Agent 的并行激进工作方式:一次是 Time Machine 本地快照因目录未排除而累积,另一次是测试脚本用 mkdtempSync 创建临时目录却未清理,每次 QA 解包 5.7 GB 仓库。这说明存储已成为继 CPU、RAM 之后的新瓶颈,且问题往往来自 Agent 自动生成的代码或配置,而非开发者手动操作。
环境边界与清理规范比扩容更紧迫
文章指出,除了购买更大存储,更需为 Agent 划定清晰严格的环境边界,并建立可靠的资源管理与清理规范。例如将 Agent 工作目录加入备份排除列表、清理已有本地快照,以及确保临时目录有对应清理操作。否则再大的硬盘也经不起 Agent 无节制消耗,而苹果存储定价昂贵,硬件升级并非长久之计。
多 Agent 并行需隔离的不只是代码
推荐阅读中 Amarildo Lucas 的文章提醒,即使通过 Git Worktree 隔离源代码,构建与测试环境仍可能共享。两个 Agent 都报告构建成功,但共享同一个 Simulator 时,后安装的应用会覆盖先前版本,导致 Agent 在不知情下验证了另一个 Agent 的构建,测试结果失去可信度。因此需通过独立 DerivedData、Simulator 和构建配置减少干扰。
Q&A
为什么我的硬盘空间会被 AI Agent 快速耗尽?
文章指出 Agent 以更激进、并行化的方式推进开发,容易产生大量数据。例如 Agent 持续创建、修改、删除文件,若目录在 Time Machine 备份范围内,本地快照会累积占用大量空间;另外 Agent 编写的测试脚本可能存在清理漏洞,如调用 mkdtempSync 创建临时目录后未清理,每次 QA 流程都解包大仓库,导致垃圾数据堆积。
如何避免 Agent 开发时把磁盘空间用光?
文章建议为 Agent 划定更清晰、严格的环境边界,并建立可靠的资源管理与清理规范。具体可参考作者经历:将 Agent 产生大量数据的目录加入 Time Machine 备份排除列表,并清理已有本地快照;同时检查 Agent 生成的脚本是否有临时目录清理逻辑,避免重复执行时堆积垃圾数据。
多个 Claude Code Agent 在同一个 Xcode 项目并行开发时,为什么测试结果不可信?
即使通过 Git Worktree 隔离了源代码,构建与测试环境并未隔离。例如两个 Agent 共享同一个 Simulator,后安装的应用会覆盖先前版本,导致 Agent 可能在不知情的情况下运行并验证了另一个 Agent 构建的应用,测试结果因此失去可信度。
多个 Agent 并行开发同一个 Xcode 项目时,需要隔离哪些东西?
文章指出需要隔离的不只是代码,还包括构建产物、运行环境与验证过程。具体可通过独立的 DerivedData、Simulator 和构建配置来减少并行 Agent 之间的相互干扰。
SwiftUI 视图重绘性能问题怎么用 Instruments 排查?
可使用 Xcode Instruments 的 SwiftUI 模板:通过 View Body Updates 的层级视图找出累计耗时较高的视图,借助更新明细表查看每次 body 执行的耗时及 Root Causes,再利用因果关系图追踪状态变化与视图更新之间的联系。分析时不能只看单次 body 耗时,还需结合更新频率与触发原因。
iOS 27 的 Now Playing 框架有什么新变化?
iOS 27 引入的 Now Playing 框架将原本分散的媒体元数据、播放状态和远程控制能力整合到统一的媒体会话模型中。开发者可通过 MediaSessionRepresentable 描述媒体内容、用 MediaPlaybackSnapshot 提供播放状态快照、通过 MediaCommand 声明系统可执行的播放操作。它还支持远程媒体会话,借助 App Extension 和推送通知,即使主应用未运行也能在锁屏和控制中心呈现外部设备播放状态并响应用户控制。
SwiftUI 适配折叠屏时如何避免内容在折叠过程中大幅跳动?
文章以 iPhone Duo 为例提出,适配不只是避开硬件限制,还要考虑设备形态变化时的视觉连续性。可利用 GeometryProxy.reservedRegions(kind:options:) 的 .includeInactive 选项提前获取尚未激活的折叠区域,为折叠状态做好布局准备;通过预先确定网格列数,并在折叠过程中动态调整列宽与间距,让内容始终分布在折痕两侧,避免因列数变化导致内容位置大幅移动。
SwiftUI Text 插值和普通字符串插值有什么区别?
Text("Hello, \(name)") 看起来像 String 插值,但背后使用的是 LocalizedStringKey 提供的专用插值方法。它不仅能插入字符串,还能直接处理数字、日期、Text、Image 等类型,并按地区语言和格式习惯呈现。可通过 FormatStyle 格式化货币、百分比和日期,用 style: 与 timerInterval: 实现自动更新的相对时间和倒计时,在同一句话中嵌入不同样式的 Text 或 SF Symbols,需要运行时数据设置样式时使用 AttributedString。相比拼接多个 Text,插值能保留完整本地化语句,让翻译人员按语言习惯重新排列内容,这也是 Text 的 + 拼接操作符从 iOS 26 开始被弃用的重要原因。