要点速览
- DerivedData 可以放心删除:下次构建时 Xcode 会重新生成,代价只是一次较慢的构建和重新索引。
- iOS DeviceSupport 文件夹可以放心删除;下次连接运行该系统版本的设备时,Xcode 会重新拷贝符号文件。
- 不要随手删除 Xcode Archives。它们包含 dSYM 文件,Xcode 需要用它们来符号化已发布版本的崩溃报告。
- 请用 xcrun simctl delete unavailable 删除模拟器,用 xcrun simctl runtime delete 删除运行时,而不是手动删除文件夹。
- 每个模拟器运行时通常有 7–10 GB,移除不再测试的 iOS 版本,往往是单项收益最大的一步。
如何安全清理 Xcode 占用的储存空间
- 退出 Xcode 和模拟器. 退出 Xcode 和“模拟器”App,确保没有构建、索引或已启动的设备正在使用你要清理的文件夹。
- 删除 DerivedData. 在访达中打开 ~/Library/Developer/Xcode/DerivedData,把其中的内容移到废纸篓。下次构建时 Xcode 会重新生成所需内容。
- 移除旧的 DeviceSupport 文件夹. 在 ~/Library/Developer/Xcode/iOS DeviceSupport 中,把不再调试的系统版本和设备对应的文件夹移到废纸篓。
- 删除不可用的模拟器. 在“终端”中运行 xcrun simctl delete unavailable,移除运行时已不再安装的模拟器设备。
- 移除不再需要的模拟器运行时. 运行 xcrun simctl runtime list,再对每个不再测试的运行时运行 xcrun simctl runtime delete 加其标识符;也可以使用 Xcode › Settings › Components。
- 最后再检查 Archives. 打开 Window › Organizer › Archives,保留用户可能仍在运行的每个版本的归档。较旧的归档请先拷贝到其他驱动器,再删除。
大多数情况下,可以。DerivedData、iOS DeviceSupport、测试设备克隆、预览模拟器和 Xcode 缓存都可以放心删除:Xcode 在需要时会重新创建它们。模拟器和模拟器运行时同样可以移除,但请使用 Apple 的 simctl 工具,而不是在访达中操作。唯一需要谨慎对待的是 Archives,因为其中保存着你已发布 App 的调试符号。
在用于 iOS 开发的 Mac 上,这些文件夹加起来常常达到几十 GB。下面逐一说明它们是什么,以及最稳妥的移除方法。
Xcode 把数据存在哪里
几乎所有内容都位于个人文件夹下的 ~/Library/Developer 中。模拟器运行时是例外:它们是由 macOS 管理的系统磁盘映像。
| 文件夹 | 路径 | 可以删除吗? | 会再出现吗? |
|---|---|---|---|
| DerivedData | ~/Library/Developer/Xcode/DerivedData |
可以 | 会,下次构建时 |
| Archives | ~/Library/Developer/Xcode/Archives |
请先检查 | 不会 |
| iOS DeviceSupport | ~/Library/Developer/Xcode/iOS DeviceSupport |
可以 | 会,连接设备时 |
| 模拟器设备 | ~/Library/Developer/CoreSimulator/Devices |
使用 simctl |
在 Xcode 中重新创建 |
| 模拟器运行时 | /Library/Developer/CoreSimulator/Volumes |
使用 simctl |
重新下载 |
| 测试设备克隆 | ~/Library/Developer/XCTestDevices |
可以 | 会,并行测试时 |
| SwiftUI 预览 | ~/Library/Developer/Xcode/UserData/Previews |
可以 | 会,运行预览时 |
| 模拟器缓存 | ~/Library/Developer/CoreSimulator/Caches |
可以 | 会 |
| Xcode 缓存 | ~/Library/Caches/com.apple.dt.Xcode |
可以 | 会 |
旁边的 watchOS DeviceSupport、tvOS DeviceSupport、visionOS DeviceSupport 和 macOS DeviceSupport 文件夹,道理与 DeviceSupport 相同。
DerivedData:可以放心删,Xcode 会重建
DerivedData 保存中间构建产物、源代码索引、构建日志和模块缓存,每个项目一个子文件夹。删除它永远不会碰到你的代码。代价是时间:每个项目的下一次构建都要从头开始,Xcode 还要重新索引,代码补全才能完全恢复。
先退出 Xcode,再把其中的内容移到废纸篓:
open ~/Library/Developer/Xcode/DerivedData
如果只想清理某一个项目,只删除它对应的子文件夹即可(名称为项目名加一串随机后缀)。Xcode 中的 Product › Clean Build Folder 会移除构建产物,但通常保留索引,因此释放的空间更少。你可以在 Xcode › Settings › Locations 中查看或更改这个位置。
Archives:保留已发布的版本
每个 .xcarchive 都是你用 Product › Archive 创建的已签名构建,其中包含 App 的 dSYM 文件。Xcode 借助它们为崩溃报告添加符号名称:如果没有对应的 dSYM,该版本的崩溃报告只会显示内存地址,而不是函数名。第三方崩溃报告工具也需要这些文件。
所以,请逐个检查归档,而不是清空整个文件夹。在 Window › Organizer › Archives 中,删除已经没有用户运行的版本,例如旧的内部测试版。对于仍在 App Store 或 TestFlight 上的版本,请保留归档,或先把 .xcarchive 包拷贝到外置驱动器,再从 Mac 上移除。
iOS DeviceSupport:可以放心删,需要时会再次拷贝
当你连接 iPhone、iPad、Apple Watch、Apple TV 或 Vision Pro 进行开发时,Xcode 会拷贝这台设备的系统符号,以便在 Mac 上调试和符号化。较新的 Xcode 会以设备型号、系统版本和构建号为每个文件夹命名,例如 iPhone15,5 27.0.1 (24A446),单个文件夹往往就有好几 GB。
你调试的每台设备每做一次 iOS 更新,就会多出一个新文件夹,而 Xcode 不会删除旧的。不再运行的系统版本对应的文件夹,可以放心移到废纸篓。如果删掉了仍需要的文件夹,下次连接这台设备时 Xcode 会再次拷贝,大约需要几分钟。
模拟器:设备和运行时是两回事
模拟器运行时是某个系统版本(例如 iOS 27.1)的完整系统映像,通常有 7–10 GB。模拟器设备则是一份小小的配置加上它自己的数据:已安装的 App、照片和设置。多个设备可以共用一个运行时,因此删除设备释放的是它的数据,删除运行时释放的才是那个大映像。
移除模拟器设备
列出设备,并移除那些已无法与当前安装的运行时配合使用的设备:
xcrun simctl list devices
xcrun simctl delete unavailable
delete unavailable 会移除当前 Xcode 已不再支持的设备,它们通常是旧运行时留下来的。要移除某一个设备,请从列表中复制它的 UDID:xcrun simctl delete <UDID>。你也可以在 Window › Devices and Simulators 中完成这一操作。除非你确实想移除所有模拟器及其数据,否则不要使用 xcrun simctl delete all。删除设备是永久性的;不过你随时可以在 Xcode 中新建一个。
移除模拟器运行时
xcrun simctl runtime list
xcrun simctl runtime delete <identifier>
runtime list 会显示每个已安装映像的版本、标识符和状态,以及总大小。runtime delete 接受标识符(每行中的 UUID),然后卸载并移除该映像。从 Xcode 27 起,delete 还支持用 --dry-run 预览,以及 --notUsedSinceDays <days>、--unusable 和 --outdated 选项。较早的 Xcode 支持的选项更少,请运行 xcrun simctl runtime 查看你的版本支持哪些。
在 Xcode 中,也可以通过 Xcode › Settings › Components(在 Xcode 15 中叫 Platforms)完成同样的操作:选中某个运行时,然后删除。Apple 关于下载和安装其他 Xcode 组件的文档说明了如何把它找回来,包括在“终端”中运行 xcodebuild -downloadPlatform iOS。
不要手动删除 /Library/Developer/CoreSimulator/Volumes 或 /System/Library/AssetsV2 中的运行时文件。较新的 Xcode 把运行时作为系统管理的资源来存储,直接删除文件可能导致运行时仍处于已登记状态,却无法使用。
测试克隆、预览和模拟器缓存
- XCTestDevices:Xcode 为并行测试创建的克隆。没有测试在运行时,可以放心移到废纸篓。
- SwiftUI 预览:Xcode 在一组专用模拟器中运行预览。
xcrun simctl --set previews delete all会移除它们;下次运行预览时 Xcode 会重新创建。 - CoreSimulator 缓存和日志:关闭“模拟器”App 后,
~/Library/Developer/CoreSimulator/Caches和~/Library/Logs/CoreSimulator可以放心清空。
旧版 Xcode、工具链和下载文件
/Applications 中的每个 Xcode 都是一个大型 App,为旧项目保留的测试版或旧版很快就会累积起来。删除之前,先确认命令行工具使用的是哪个 Xcode:
xcode-select -p
保留这个路径指向的那份,以及 CI 任务或旧项目仍然需要的版本。另外看看 ~/Downloads 中有没有 .xip 文件:Xcode 安装完成后,这个压缩包就不再需要了。从 swift.org 下载的其他 Swift 工具链位于 ~/Library/Developer/Toolchains,请保留项目实际选用的那些。
~/Library/Caches/com.apple.dt.Xcode 是 Xcode 自己的缓存,会按需重建。如果你用了很多年 Xcode,可能还会在 ~/Library/Developer/Shared/Documentation/DocSets 中找到很早期的 Xcode 下载的离线文档集;当前版本已经不再使用它们。
推荐的清理顺序
- 退出 Xcode 和模拟器。
- 删除 DerivedData、XCTestDevices 和预览模拟器。这一步没有风险。
- 运行
xcrun simctl delete unavailable。 - 移除不再面向的系统版本对应的 DeviceSupport 文件夹和模拟器运行时。
- 最后再慎重检查 Archives 和旧版 Xcode。
完成后清倒废纸篓,空间才会真正回来。这些文件夹在 macOS 27 Golden Gate、26 Tahoe、15 Sequoia 和 14 Sonoma 上都一样;可用的 simctl 选项取决于你的 Xcode 版本。
MoreRoom 能帮你做什么
MoreRoom 免费版会扫描 ~/Library/Developer,识别上述每个文件夹,标注“可安全移除”或“请先检查”,并说明它是否会再次出现。DerivedData、DeviceSupport、测试克隆和缓存可以逐项移到废纸篓,并且可以撤销。对于模拟器设备和运行时,MoreRoom 会运行 Apple 自己的 xcrun simctl delete 和 xcrun simctl runtime delete;这些命令是永久性的,并会明确标注。Archives 会被标记为建议保留。
MoreRoom Pro 还提供“收集器”(一次清理多个项目)、目标模式(根据你需要的空间挑选最安全的组合)以及针对不活跃项目的项目休眠。从 MoreRoom 直接把归档转移到外置驱动器的功能即将推出;目前请自行拷贝。
常见问题
删除 DerivedData 会破坏我的 Xcode 项目吗?
不会。DerivedData 只包含 Xcode 生成的构建产物、索引和日志。你的源代码和项目设置都保存在项目文件夹中。Xcode 重新生成这些数据期间,下一次构建和索引会花更长时间。
删除 Xcode Archives 安全吗?
只适用于已经没人运行的版本。每个归档都包含 dSYM 文件,可以把崩溃报告中的地址转换成函数名。凡是仍在用户手中的版本,都请保留归档,或先拷贝到其他驱动器。
为什么 iOS DeviceSupport 删了又会出现?
你每连接一台设备进行开发,Xcode 都会从中拷贝调试符号,每种设备型号和系统版本各一份。如果删掉了仍在使用的设备对应的文件夹,下次连接这台设备时,Xcode 会再次拷贝。
可以直接删除 CoreSimulator 文件夹吗?
最好不要。模拟器设备和运行时都登记在 CoreSimulator 服务中,而运行时是挂载的系统磁盘映像。请使用 xcrun simctl delete 和 xcrun simctl runtime delete,或 Xcode 的设置,这样登记信息才能保持一致。
删除的模拟器运行时怎样找回来?
在 Xcode › Settings › Components 中重新下载,或在“终端”中运行 xcodebuild -downloadPlatform iOS。之后可以在 Window › Devices and Simulators 中重新创建模拟器设备。