版本记录
版本号 | 时间 |
---|---|
V1.0 | 2021.03.24 星期三 |
前言
程序总会有bug,如果有好的调试技巧和方法,那么就是事半功倍,这个专题专门和大家分享下和调试相关的技巧。希望可以帮助到大家。感兴趣的可以看下面几篇文章。
1. 程序调试 (一) —— App Crash的调试和解决示例(一)
2. 程序调试 (二) —— Xcode Simulator的高级功能(一)
3. 程序调试 (三) —— Xcode Simulator的高级功能(二)
开始
首先我们看下写作内容:
了解如何释放
Xcode
在缓存,derived data
,archives
和simulators
中占用的空间。内容来自翻译。
下面就是写作环境了
Swift 5, iOS 14, Xcode 12
接着就是正文啦
Xcode
不仅仅是普通的旧文本编辑器。 还是功能完善的集成开发环境(Integrated Development Environment (IDE))
。
使用IDE
进行iOS
开发具有许多好处。 Xcode使构建项目,调试项目和对最终应用程序进行代码签名变得容易。
但是,IDE
提供的所有功能都会占用Mac
存储空间。 全新安装的Xcode
在Mac上需要11 GB
。 但是那11 GB
只是冰山一角。 尽管具有良好的品质,Xcode
还是臭名昭著的存储猪。
随着时间的推移,Xcode
的存储容量在考虑其一些工具和目录时会膨胀:
Derived data
Caches
Old archives
Unavailable simulators
Device support files
更糟糕的是,这些保存的数据不仅会吞噬Mac的宝贵存储空间。它也可能是奇怪的bug
和编译问题的来源。
如果在构建应用程序时看到奇怪的行为,则清除诸如derived data and caches
之类的文件夹可以帮助恢复正常状态。甚至Xcode
有时也需要进行大清除。
注意:在
Mac
上删除Xcode
的数据时,请务必小心。除非您确定Xcode
可以正常使用,否则请勿删除任何内容。本教程将为您提供何时以及为何删除Xcode支持文件的专业知识。
在本教程中,您将详细了解每个目录的用途以及为什么要清除它。
了解每个目录的作用后,您将编写一个脚本来帮助使Mac
保持最佳状态。
因此,准备收回一些久违的Mac
存储!
首先,在Xcode中打开starter
项目。 确保选择一个模拟器作为构建target
,然后进行构建和运行。
通过使用NASA
的Astronomy Picture of the Day API
,Stellar Space
可以显示NASA
拍摄的图像,供用户选择并保存到其设备中。
保存到iOS模拟器的图像会使用Mac
上的存储空间。 清除存储空间是您在本教程中将学习的内容之一。
之前,当您构建Stellar Space
时,Xcode
保存了一些缓存并构建了文件。 接下来,将其清除。
Clearing Derived Data
当您构建项目时,Xcode
会在derived data
中存储该项目的构建文件。 您将在macOS
用户库中找到派生数据文件夹(derived data folder)
。
要查找您的派生数据文件夹,请打开一个新的Finder
窗口。 在Finder
菜单栏中,选择Go ▸ Go to Folder…
。
在这里,键入您的派生数据文件夹的位置:
~/Library/Developer/Xcode/DerivedData
点击Go
将Finder
窗口的路径更改为DerivedData
。
您的派生数据包含ModuleCache.noindex
文件夹以及您在Xcode中构建的任何项目的文件夹,例如Stellar Space
。
ModuleCache.index
存储Xcode
之前编译的模块。 Xcode
在项目和构建之间共享这些缓存的模块,以缩短构建时间。
同样,单个项目文件夹也可以缩短构建时间。在Stellar Space
文件夹中,您会找到Xcode
上次构建Stellar Space
时生成的支持文件。
1. When to Delete Derived Data
DerivedData
中的所有内容都可以安全删除。实际上,清除派生数据是解决iOS
开发人员讨厌的编译问题的常见技巧。
尽管删除派生数据是安全的,但是Xcode
从头开始构建项目时,下次构建将花费更长的时间。
2. Deleting Derived Data
清除派生数据就像从Finder
中删除整个文件夹一样简单。接下来,如果您要保留构建时间特别长的其他任何应用程序的数据,则仅删除Stellar Space
文件夹。
在Finder
窗口中,查找Stellar Space
的派生数据。
我的被命名为Stellar_Space-gmjdilbusvnhawfcpcbkkdqfsiuv
,但是您的会有所不同。
右键单击Stellar_Space
文件夹,然后选择Move to Trash
将其删除。
注意:根据Mac上的语言设置,菜单选项可能显示
Move to Bin
或其他一些本地化的选项。
这样,您就清除了Stellar Space
的派生数据。 切记:要删除所有派生数据,您需要删除整个DerivedData
文件夹。
这将清除您构建的Stellar Space
的debug
版本。 但是archived release
版本存储在其他位置。
Clearing Archives
每当您archive
要在TestFlight
或App Store
上distribution
的应用程序时,该archive
都将本地存储在Mac
上。 您可能有多年的archive
等待清理。
在本部分中,您将archive
Stellar Space
,然后从Mac
中删除该存档,以节省宝贵的存储空间。 但是首先,您需要准备Stellar Space
进行代码签名。
1. Archiving Stellar Space
在Xcode
中,请按照以下步骤操作,以获取Stellar Space
的Signing and Capabilities
设置:
- 1) 在项目导航器中,选择
Stellar Space
。 - 2) 在
Targets
下选择Stellar Space
。 - 3) 选择
Signing & Capabilities
选项卡。
当前,用于archive Stellar Space
的Team
设置为None
。 将Team
的值更改为您自己的Apple Developer
帐户的值。
注意:如果您没有
Apple Developer
帐户,可以在这里使用,请不要担心。 您可以在不archiving Stellar Space
的情况下继续阅读。
在为模拟器构建应用时,您无法archive
应用,因此请将运行run
目标更改为Any iOS Device (arm64)
:
现在,您就可以archive
该应用了。 在Xcode
的菜单栏中,选择Product ▸ Archive
。
如果出现提示,请输入您的macOS
用户的密码:
Xcode
构建完成后,Archives
窗口将打开并显示结果。
Xcode
创建了您的archive
。 实际的.xcarchive
文件夹位于Mac
上的〜/ Library / Developer / Xcode / Archives
中。
2. Clearing the Archived Build
要打开archives
文件夹,请打开Finder
窗口。 在Finder
菜单栏中,单击Go ▸ Go to Folder…
,然后输入archives
文件夹的路径:
点击Go
每个archive
都存储在一个子文件夹中,该子文件夹以创建日期的日期命名。 打开今天的文件夹,查看您之前创建的Stellar Space archive
。
右键单击.xcarchive
,然后选择Move to Trash
。
您已删除archive
,节省了少量的磁盘空间。但是,archive
文件夹中可能有千兆字节的.xcarchives
。什么时候可以安全清除它们?
3. When to Clear Archives
与derived data
不同,archives
不会影响您的未来构建。它们是构建应用程序的最终产品,因此不会以任何方式加快编译速度。但这并不意味着只要空间不足,就可以清除archives
文件夹。
有时,保存旧archives
可能是一个好主意。如果您需要重新发布旧的archives
文件,则需要存储在archives
文件夹中的.xcarchive
。
另外,调试应用的指定版本需要将archive
文件中打包的一个称为dSYM
的文件。
因此,一个很好的建议是不要删除当前正在运行的应用程序版本的任何archive
,也不要删除以后可能要使用的旧archive
!
在将您的应用archive
到Xcode
中之前,您可能会在模拟器上运行它以测试您的应用。接下来,您将学习如何清除这些模拟器并删除旧数据。
Clearing Simulators
在其中一个模拟器上安装Stellar Space
时,它将占用您计算机上的一些空间。 Stellar Space
还可以将图像保存到模拟器的照片库中,从而占用更多空间。
有时,您可能还想像新用户一样测试应用程序。这意味着从全新的模拟器开始。因此,清除这些模拟器可以帮助使Mac
保持最佳状态。
1. Storing Simulator Data
在清除模拟器之前,您需要运行Stellar Space
,以便清除某些内容。
在Xcode
中,确保将运行目标设置为您的模拟器之一:
构建并运行Stellar Space
难道不是每个人都喜欢令人敬畏的宇宙图像吗? 继续并点击Save
,将今天的图像保存到模拟器的Photos
中。
当iOS
提示您授予访问照片的权限时,点按OK
。
点按Back
可以查看昨天的当天照片,并可以随意探索更多内容。 通过点击Save
来保存您喜欢的照片。
完成后,从模拟器底部向上滑动以进入主屏幕。 或者,您也可以选择Device ▸ Home
或按键盘上的Command-Shift-H
。
接下来,打开Photos
。 您可能需要滑动到其他Home tab
才能找到Photos
图标。
在这里,您会看到保存在模拟器上的所有图像。
在iPhone
上删除应用程序并不会删除该应用程序可能已存储在其他位置的所有数据,例如文件,照片或Core Data数据库。 为此,您需要删除模拟器的内容。
注意:如果您不喜欢在模拟器上清除数据,请随时跳过下一部分的说明,继续阅读!
2. Erasing Simulator Content
擦除模拟器会将其还原为出厂内容和设置,并删除存储在其上的所有应用程序或数据。
打开模拟器后,在菜单栏中单击Device ▸ Erase All Content and Settings…
。
如果您准备丢失该模拟器上的数据,请单击Erase
。
等待模拟器重启。 完成后,再次打开Photos
。
您可以在任何模拟器上找到默认照片,随时可以重新开始测试!
擦除模拟器内容有助于清洁您可以访问的模拟器。 但是您可能会失去甚至看不到的模拟器的大量存储空间。
3. Deleting Unavailable Simulators
如果您一段时间以来一直在开发iOS应用,那么您可能已经经历了几个模拟器的周期。
当Apple
发行新的iPhone
时,通常会附带新版本的Xcode
和iOS
。 这些新的iPhone需要自己的模拟器,而较旧的模拟器已过时。 如果您有旧的无法使用的模拟器,则它们可能正在Mac
上使用存储。
要一次清除所有不可用的模拟器,需要执行终端命令。
打开Terminal.app
。 然后,输入以下命令:
xcrun simctl delete unavailable
按Enter
如果没有可用的模拟器,则会显示一条输出,告诉您已清除的内容。 如果输出为空白(如上一个屏幕截图所示),则说明您在定期删除旧模拟器方面做得很好。
与不可用的模拟器一样,您的Mac也存储了旧iOS
版本的支持文件。 使用时,您可以清除所有不再需要的支持文件,以腾出一些空间。
Device Support
当您将物理设备连接到Mac以安装或调试其中一个应用程序时,Xcode
会创建device support
文件。 Xcode使用这些文件来支持开发人员功能,例如查看崩溃日志。
设备支持device support
文件特定于每个iOS
版本,甚至是次要版本。 因此,如果您经常构建设备,则可能具有适用于iOS 14.1、14.2、14.2.1
等的支持文件。
Xcode
永远不会为您删除这些文件,因此它们会随着时间的流逝逐渐建立。 幸运的是,自己删除它们没有任何危害。 每当您使用物理设备时,Xcode都会自动安装设备支持文件。
1. Finding Device Support Files
要查找您的iOS设备支持文件,请打开一个新的Finder
窗口。 在Finder
菜单栏中,选择Go ▸ Go to Folder…
,然后输入以下路径:
~/Library/Developer/Xcode/iOS DeviceSupport
点击Go
这些支持文件在Mac
上的使用量高达11 GB
,这是进行清理的主要选择。一个很好的建议是删除iOS DeviceSupport
文件夹中除最新的两个iOS版本外的所有版本,因为您可能仍会支持这些版本。
该文件夹仅用于iOS设备支持,但是watchOS
和tvOS
遵循类似的模式。
2. Other Platforms
与iOS
文件一样,您可以在〜/ Library / Developer / Xcode / watchOS DeviceSupport
中找到watchOS
支持文件。 Xcode
将tvOS
设备支持文件存储在〜/ Library / Developer / Xcode / tvOS DeviceSupport
中。
如果您尚未出于开发目的将Apple Watch
连接到Mac
,则将没有watchOS DeviceSupport
文件夹。同样适用于iOS
和tvOS
。
Caches
寻找空间节省的最后一个地方是各种缓存。
缓存存储数据,因此使用缓存的程序可以运行得更快,而无需重新计算缓存中的数据。
缓存始终是瞬态的,这意味着缓存中包含的数据是临时的。删除缓存的数据不会产生不利影响,因为创建缓存的程序可以随时重新生成它。但是对于较大的缓存,重建缓存时可能会遇到延迟。
删除缓存是回收空间的常用策略。例如,当删除Xcode的缓存时,所有未使用的旧数据将保持删除状态。 Xcode可以在以后重新生成它仍然需要的任何东西。
如果您在使用Xcode或其相关工具之一时遇到问题,清除缓存也可以帮助解决此问题。
大多数缓存都存储在〜/ Library / Caches
中,包括Xcode
缓存。您可以在〜/ Library / Caches / com.apple.dt.Xcode
中找到Xcode的缓存。
1. Supporting Caches
另外两个值得注意的缓存是Carthage
和CocoaPods
的缓存。 这些依赖项管理器可帮助您管理您可能在应用程序中使用的第三方库。
如果您使用Carthage
,则可以在〜/ Library / Caches / org.carthage.CarthageKit
中找到其缓存。
CocoaPods
有一个特殊的命令,您可以用来清除其缓存。 要清除CocoaPods
缓存,请在终端中运行以下命令:
pod cache clean --all
使用专用的cache clean
命令比手动删除文件夹更好。 这是因为,如果CocoaPods
更改了其存储缓存的位置,则该命令仍适用于新位置。 如果您决定编写脚本来清除缓存,那真是个好消息!
实际上,在下一节中,您将做到这一点,将迄今为止在最终的春季大扫除脚本中学到的所有内容结合在一起!
Tying it All Together
与其记住要释放一些数据的位置,不如将每个步骤整理到一个自动化脚本中,然后在空间不足时运行该脚本要容易得多。
自动化解决方案不要做任何破坏性很重要的事情。 清除某些文件夹(例如archives
)时,请务必谨慎。
对于不需要人工操作的缓存和其他文件夹,脚本是合适的解决方案。
1. Creating a Script
首先,打开一个终端窗口。 运行以下命令:
cd ~/Documents && touch clean-xcode.sh
这会将终端窗口的目录更改为您的Documents
文件夹。 之后,它将创建一个新的空白脚本。
注意:可能会要求您授予终端访问文件文件夹中文件的权限。 如果要求您这样做。
在您喜欢的文本编辑器中打开空脚本。 然后,键入:
#!/usr/bin/env bash
# 1
echo "Removing Derived Data..."
rm -rf ~/Library/Developer/Xcode/DerivedData/
# 2
echo "Removing Device Support..."
rm -rf ~/Library/Developer/Xcode/iOS\ DeviceSupport
rm -rf ~/Library/Developer/Xcode/watchOS\ DeviceSupport
rm -rf ~/Library/Developer/Xcode/tvOS\ DeviceSupport
# 3
echo "Removing old simulators..."
xcrun simctl delete unavailable
# 4
echo "Removing caches..."
rm -rf ~/Library/Caches/com.apple.dt.Xcode
rm -rf ~/Library/Caches/org.carthage.CarthageKit
# 5
if command -v pod &> /dev/null
then
# 6
pod cache clean --all
fi
echo "Done!"
文件的开头是一个Shebang
,它告诉您的计算机如何执行脚本。 shebang
始终必须是脚本的第一行。
文件的其余部分是到目前为止您学到的所有内容的总和。 这是逐步发生的事情:
- 1) 首先,
echo
将消息输出到终端,因此您知道脚本的运行方式。 然后,rm
删除derived data
文件夹。 - 2) 打印另一个状态更新,然后删除每个
device support
文件夹。 如果文件夹不存在,则什么也不会发生。 - 3) 删除不可用的模拟器。
- 4) 删除
Xcode
和Carthage
的缓存(如果存在)。 - 5) 检查此计算机上是否安装了
CocoaPods
。 - 6) 如果安装了
CocoaPods
,清理CocoaPods cache
。
接下来,保存文件。 在TextEdit
中,通过单击File ▸ Save
在TextEdit
的菜单栏中进行此操作。
您已经创建了脚本,几乎可以尝试了。
2. Running the Script
如果尝试按原样运行clean-xcode.sh
,则会收到错误消息:
那是因为您的计算机将其视为文本文件,而不是您可以执行的脚本或程序。 要使其可执行,您需要在终端中运行命令。
在“终端”窗口中,运行以下命令:
chmod u+x clean-xcode.sh
现在,您的计算机将clean-xcode.sh
识别为可执行脚本。
注意:如果您还不准备删除
derived data, device support or caches
,请不要运行该脚本。 您仍可以继续阅读本节的其余部分。
最后,您可以通过在终端中指定其路径来运行clean-xcode.sh
:
./clean-xcode.sh
该脚本将执行,并在清除派生数据,设备支持,模拟器和缓存(derived data, device support, simulators and caches)
时打印出状态报告。
使用一个命令,您已经收回了Xcode
随着时间的推移而建立的一些存储。
在本教程中,您学习了一些方法来回收Xcode
声称拥有的某些存储。 您了解了何时要清除每个位置,以及何时应该更谨慎地删除某些文件。 您还了解了Xcode的缓存和中间数据如何影响编译问题。
要了解有关Xcode
在整个构建过程中如何工作的更多信息,以及更多用于构建自动化的脚本,请参阅iOS App Distribution & Best Practices。
后记
本篇主要讲述了
Xcode
内存管理,感兴趣的给个赞或者关注~~~