如果 Xcode 模拟器正在占用 Mac 大量空间,请在删除任何内容之前先区分模拟器运行时和模拟器设备数据。首先审查什么是不可用的、什么是非活跃的、以及你仍然需要用于测试的内容,因为模拟器清理在将每个 Apple 侧文件夹都当作可丢弃缓存处理时会变得有风险。
这是开发者在学到一条清理规则后就到处套用时犯的错误。DerivedData 是一回事。模拟器运行时和模拟器设备状态是另一回事。
存储是可以回收的。只是后果不那么统一。
核心原则:按层级清理模拟器存储。先移除不可用的设备,仅在确实要重置时才擦除设备数据,并仅在你不再需要该操作系统版本时才删除运行时。
快速回答
- 检查实际占用是模拟器运行时、模拟器设备数据,还是两者兼有。
- 在删除任何内容之前使用
xcrun simctl list devices和xcrun simctl list runtimes。 - 当不可用设备出现在不可用部分时,首先用
xcrun simctl delete unavailable删除它们。 - 仅当你想重置模拟器设备的内容和设置时才使用
erase。 - 仅在你确定不再需要该平台版本用于构建、预览或测试时才删除运行时。
- 如果 Apple 侧存储超出了模拟器范围,一起审查
DerivedData、Archives和CoreSimulator,而不是从一个文件夹猜测。
CoreSimulator 是什么
CoreSimulator 是 Apple 管理的文件夹,Xcode 在其中保存构建和测试 iOS、iPadOS、watchOS、tvOS 应用所用的模拟器运行时和已创建的模拟器设备。在大多数 Mac 上它位于 ~/Library/Developer/CoreSimulator,随着你添加运行时、创建设备、在其中积累应用数据而不断变大。
它不是普通缓存。这个文件夹混着两样东西:你可能还依赖的运行时镜像,以及很多情况下可以重置或删除的设备状态。所以”CoreSimulator 占了几十 GB”没有唯一答案。
可以删除 CoreSimulator 文件夹吗
不要整个文件夹一删了之。清空正确的那一层,而不是抹掉整条路径,就能拿回大部分空间。
手动删掉整个 ~/Library/Developer/CoreSimulator,Xcode 就得重建模拟器状态,你还需要的运行时也会一起消失。安全的做法是让 Apple 自己的 simctl 去清理真正可丢弃的部分:
- 用
xcrun simctl delete unavailable删除当前 SDK 不再支持的设备; - 当问题出在应用状态膨胀时,用
xcrun simctl erase <device>重置设备的内容和设置; - 只有确定不再测试某个系统版本时,才用
xcrun simctl runtime delete删除该运行时。
CoreSimulator 的空间是一层一层拿回来的,而不是删掉文件夹再指望 Xcode 自己恢复。
Xcode 模拟器存储了什么以及为什么会累积
模拟器存储不是一样东西。它是多个层级一起累积的结果。
从高层级来看,Xcode 模拟器存储通常包括:
- 不同 iOS 平台版本的运行时镜像;
- 为不同 iPhone 和 iPad 型号创建的模拟器设备;
- 这些模拟器内每个设备的应用数据、设置和状态;
- 在你切换 SDK、设备类型和 Xcode 版本时增长的 Apple 侧开发开销。
这就是为什么开发者经常对 CoreSimulator 感到困惑的原因。很容易看到文件夹大小就假设整个东西只是缓存。实际上,其中一部分更像是一次性的测试状态,而另一部分是你仍然依赖的运行时支持。
增长模式是正常的:
- 你安装了新的 Xcode 或 SDK;
- 新的运行时出现;
- 创建了新的模拟器设备;
- 应用、测试数据和设置在其中累积;
- 旧设备在 SDK 更改或 Xcode 升级后变为不可用;
- 数月没有被审查,因为机器仍有足够的可用空间。
然后某一天模拟器存储成为主要问题,而不再是一个细节。
模拟器运行时 vs 模拟器数据:有什么区别?
这是最重要的区分。
Apple 的 simctl 工具将运行时操作与设备操作分开处理。这本身就告诉你清理模型是分层的:设备与运行时不是同一回事,擦除设备与删除运行时镜像也不是同一回事。
| 层级 | 代表什么 | 典型清理操作 | 主要权衡 |
|---|---|---|---|
| 模拟器运行时 | 用于启动特定平台版本的操作系统运行时镜像 | 对你确实不再需要的运行时执行 simctl runtime delete | 你失去该运行时用于未来模拟器使用,直到重新添加 |
| 模拟器设备 | 为特定设备型号创建的模拟器实例 | simctl delete <device> 或 delete unavailable | 设备实例消失 |
| 模拟器设备内容和设置 | 设备内安装的应用、应用数据、设置和状态 | simctl erase <device> | 设备保留,但其内容和设置被重置 |
这就是为什么像”直接清掉 CoreSimulator”这样笼统的说法是不好的建议。它们将不同的清理后果压缩成一个情绪化的操作。
DerivedData 在哪里适用
DerivedData 是相关的,但不是同一个问题。
DerivedData 通常是生成的构建输出。模拟器存储更复杂。它可以包含你仍然需要的运行时、你不再需要的已创建设备、以及设备内你可能关心也可能不关心的状态。
如果压力主要来自生成的构建输出,正确的指南是 Xcode DerivedData 占用过多空间?应该优先清理什么。如果压力主要来自运行时镜像和模拟器状态,继续使用模拟器工作流。
如何检查模拟器占用了多少空间
第一步是检查,而不是删除。
使用 Apple 自己的工具查看实际存在哪些设备和运行时:
xcrun simctl list devices
xcrun simctl list runtimes
如果你想直接检查磁盘上更广泛的 Apple 侧存储占用,也可以直接比较主要文件夹:
du -sh ~/Library/Developer/CoreSimulator
du -sh ~/Library/Developer/Xcode/DerivedData
du -sh ~/Library/Developer/Xcode/Archives
这很重要,因为最大的 Apple 侧文件夹并不总是你假设的那个。有时 DerivedData 是主要问题。有时 CoreSimulator 悄悄超过了它。
首先要找什么
- 列在
Unavailable下的设备; - 你不再测试的操作系统版本的运行时;
- 跨多个运行时世代创建的大量设备;
- 自多次 Xcode 更新以来未清理过的机器上模拟器密集的状态;
- 与你当前测试需求不匹配的大型
CoreSimulator文件夹。
那就是清理从反应式变为理性式的起点。
在 Xcode 中删除模拟器的步骤
如果你要真正删除模拟器而不只是查看,有两条安全路径:Xcode 界面和 simctl 命令行。两者都能清掉旧模拟器,同时不碰你还需要的运行时。
在 Xcode 应用中:
- 打开 Xcode,进入 Window → Devices and Simulators。
- 选择 Simulators 标签页。
- 右键点击不再需要的模拟器并选择 Delete,或用 Delete Unavailable Simulators 一次清掉当前 SDK 不再支持的设备。
在命令行中:
# 先列出全部
xcrun simctl list devices
# 删除当前 SDK 标记为 unavailable 的所有设备
xcrun simctl delete unavailable
# 按 UDID 删除某一台设备
xcrun simctl delete <device-UDID>
删除不可用模拟器是最干净的第一步,因为消失的只有 Apple 已标记为不支持的设备。删除某台具体设备只会移除该模拟器实例,运行时镜像仍在原处,项目需要时可以重新创建。
如果目标是腾出空间,先从这里开始,再考虑运行时:删掉的设备很快能重建,删掉的运行时是更重的决定。
在 Mac 上删除模拟器运行时安全吗?
有时可以,但这不是最安全的第一步。
Apple 的 simctl runtime 帮助明确指出运行时镜像是独立管理的对象。删除运行时与清除模拟器内容不同,也与删除不可用设备不同。
这意味着运行时删除最适合以下情况:
- 你不再需要该 iOS 版本进行测试;
- 你已经超越了旧的 Xcode 或 SDK 世代;
- 该运行时足够不常用,空间价值超过了便利性;
- 你已经先查看了运行时列表并确切知道你要移除什么。
以下情况是不好的选择:
- 一个活跃项目仍然面向该运行时系列;
- SwiftUI 预览、QA 复现步骤或回归测试仍然依赖它;
- 你即将在旧目标上演示或调试问题;
- 你仅根据大小而非实际测试需求在删除。
更好的第一步:移除明显的无用负担
最安全的模拟器清理通常从不可用设备开始。
Apple 在 simctl delete 中直接文档化了这一点:unavailable 别名删除当前 Xcode SDK 不支持的设备。
xcrun simctl delete unavailable
这不是通用答案,但它是其中一个最干净的首轮操作,因为它针对的是已经被当前 SDK 上下文标记为不支持的设备。
在不破坏开发环境的情况下清理模拟器数据
这是开发者经常用错工具的地方。
如果你的问题是模拟器内过期的应用数据或膨胀的设备状态,你可能根本不需要删除运行时。你可能只需要重置模拟器设备。
Apple 的 simctl erase 帮助将 erase 定义为擦除设备的内容和设置:
xcrun simctl erase <device>
这是一个重置操作,不是运行时移除操作。
erase 适合做什么
- 清除模拟器内的应用状态;
- 重置测试环境;
- 移除膨胀的设备级内容而不移除运行时镜像本身;
- 保留设备工作流同时丢弃其累积的状态。
erase 不是什么
- 不是运行时清理命令;
- 不是
DerivedData清理命令; - 不是审查你实际仍需要哪些设备和运行时的好替代方法。
这个区分就是整个模拟器清理的全部故事:擦除设备、删除设备和删除运行时是三个不同的决定。
CoreSimulator 在磁盘上的位置
排查模拟器占用时,有两条路径值得看。
~/Library/Developer/CoreSimulator/Devices 存放你创建的模拟器设备。每台设备是一个以 UDID 命名的文件夹,其中的 data/ 装着已安装的应用、应用数据和设置。simctl erase 重置的、simctl delete 移除的就是这一层。
系统级的 /Library/Developer/CoreSimulator 承载运行时那一侧。取决于 Xcode 版本,运行时镜像可能以 .simruntime 包的形式放在 Profiles/Runtimes 下,也可能由 Xcode 作为可下载运行时管理,用 xcrun simctl runtime list 查看。在那里删除任何东西都会影响 Mac 上的每个用户账户,所以要当作更重的决定处理。
du -sh ~/Library/Developer/CoreSimulator/Devices
du -sh /Library/Developer/CoreSimulator
xcrun simctl runtime list
如果 Devices 占大头,问题在累积的设备状态和当前 SDK 不再支持的设备。如果系统级文件夹占大头,问题在运行时镜像。
可以把 CoreSimulator 移到外接硬盘吗
内置磁盘偏小、模拟器文件夹超过 40 GB 时,这个问题就会冒出来。Apple 没有提供受支持的迁移设置,于是开发者用符号链接:把 ~/Library/Developer/CoreSimulator 复制到外接卷,核对副本,删除原目录,再把旧路径链接到新位置。
你要接受的代价:
- 硬盘未挂载时路径消失,Xcode 无法启动模拟器;
- 在总线供电的 USB 硬盘上,模拟器启动比内置 SSD 慢;
- Xcode 或 SDK 更新可能在原路径重新创建部分目录结构;
- 备份和权限在外接卷上的行为不一样。
搬走整个文件夹之前,先量一量能回收多少。删除不可用设备和不再测试的运行时,往往比搬迁腾出更多空间,而且保持在 Apple 支持的配置里。
如何持续管理模拟器存储
实际目标不是”永远不让模拟器增长”。实际目标是”阻止模拟器存储变成不可见的”。
使用这样的审查节奏:
- 在重大 Xcode 或 SDK 更改之后列出设备和运行时。
- 当不可用设备出现时删除它们。
- 当问题是设备状态而非运行时清单时,重置过期的模拟器设备。
- 在完全移除某个操作系统版本之前审查运行时使用情况。
- 当 Apple 侧存储开始攀升时,一起比较
CoreSimulator、DerivedData和Archives。
这让清理决策与实际占用昂贵的层级保持一致。
Apple 侧存储的更好心智模型
DerivedData主要是生成的构建输出。Archives保留交付物和构建历史。CoreSimulator混合了运行时支持和模拟器设备状态。- 最安全的清理取决于哪个层级大,而不仅仅是哪个文件夹可见。
一旦你按层级思考,模拟器清理就会变得不那么混乱。
为什么保持感知生态系统让开发者清理效果更好
如果你只使用 Finder,一个 20 GB 或 30 GB 的 Apple 侧文件夹看起来像是一个明显的清理目标。实际上不是。
文件浏览器可以告诉你 CoreSimulator 很大。它不能告诉你真正可回收的空间是:
- 不支持的设备;
- 可重置的模拟器内容;
- 你不再需要的运行时;
- 还是恰好住在附近的另一个 Xcode 配置文件。
这就是为什么模拟器清理属于开发者清理,而非通用文件清理。
如果你的实际问题是”模拟器加上 DerivedData 加上其他 Apple 开发者存储”,那种更全面的感知配置文件工作流比逐个追逐文件夹路径有用得多。
总结
如果 Xcode 模拟器正在占用 Mac 大量空间,不要把 CoreSimulator 当作一个可随意丢弃的缓存桶。
先审查设备和运行时。将删除不可用设备作为干净的第一轮操作,仅当你想重置模拟器内容和设置时使用 erase,并仅在你确实不再需要该操作系统版本时才移除运行时。
这是更安全的清理路径:将运行时镜像与设备状态分开,将模拟器存储与 DerivedData 分开,让 Apple 侧清理与实际测试需求关联,而不是盲目删除文件夹。
常见问题
为什么 Xcode 模拟器在 Mac 上占用这么多磁盘空间?
模拟器存储增长是因为 Xcode 随时间积累运行时镜像、已创建的模拟器设备、这些模拟器内的应用数据以及其他 Apple 侧的开发状态。跨多个 iOS 版本和设备类型进行测试会使存储占用快速膨胀。
模拟器运行时和模拟器数据有什么区别?
模拟器运行时是 Xcode 用于启动特定平台版本模拟器的操作系统运行时镜像。模拟器数据是已创建模拟器内的设备级状态,例如已安装的应用、应用数据和设置。
删除不可用的模拟器设备安全吗?
通常安全。Apple 的 simctl 工具明确支持删除不可用的设备,即当前 Xcode SDK 不再支持的设备。这通常是最安全的模拟器清理步骤之一。
在 Mac 上删除模拟器运行时安全吗?
有时可以,但仅在你确定不再需要该运行时用于测试、预览或较旧项目目标时。移除运行时比擦除模拟器内容是更大的决定,因为它移除的是运行时镜像本身。
擦除模拟器会删除运行时吗?
不会。Apple 的 simctl 帮助将 erase 描述为清除设备的内容和设置。这会重置模拟器设备,但与删除其背后的运行时镜像是不同的操作。
CoreSimulator 是什么?
CoreSimulator 是位于 ~/Library/Developer/CoreSimulator 的 Apple 管理文件夹,Xcode 在其中保存模拟器运行时和为测试创建的模拟器设备。它随着运行时的添加、设备的创建以及其中积累的应用数据而变大,因此混着你还需要的存储和可以重置或删除的存储。
可以删除 CoreSimulator 文件夹吗?
整个文件夹一起删并不安全,那样会移除你还需要的运行时,并迫使 Xcode 重建模拟器状态。请按层回收空间:xcrun simctl delete unavailable 删除不受支持的设备,xcrun simctl erase 重置设备内容,xcrun simctl runtime delete 只用于你不再测试的系统运行时。
如何在 Xcode 中删除模拟器?
在 Xcode 中打开 Window 再进入 Devices and Simulators,选择 Simulators 标签页,右键删除某个模拟器,或使用 Delete Unavailable Simulators。命令行下,xcrun simctl delete unavailable 会删除当前 SDK 不再支持的设备,xcrun simctl delete <UDID> 删除指定设备并保留其运行时镜像。
CoreSimulator 文件夹在 Mac 的什么位置?
模拟器设备位于 ~/Library/Developer/CoreSimulator/Devices,每个设备文件夹以 UDID 命名,并在 data/ 下保存已安装的应用和设置。运行时镜像位于系统级的 /Library/Developer/CoreSimulator,取决于 Xcode 版本,可能是 Profiles/Runtimes 下的 .simruntime 包,也可能是 xcrun simctl runtime list 显示的可下载运行时。
可以把 Xcode 模拟器移到外接硬盘吗?
Apple 没有提供受支持的设置。开发者用从 ~/Library/Developer/CoreSimulator 到外接卷某个文件夹的符号链接来实现,但此后 Xcode 依赖该硬盘保持挂载,模拟器通过 USB 启动更慢,Xcode 更新还可能在原路径重建部分结构。删除不可用设备和闲置运行时,通常能腾出更多空间,风险也更小。