程序调试 (四) —— Xcode内存管理(一)

版本记录

版本号 时间
V1.0 2021.03.24 星期三

前言

程序总会有bug,如果有好的调试技巧和方法,那么就是事半功倍,这个专题专门和大家分享下和调试相关的技巧。希望可以帮助到大家。感兴趣的可以看下面几篇文章。
1. 程序调试 (一) —— App Crash的调试和解决示例(一)
2. 程序调试 (二) —— Xcode Simulator的高级功能(一)
3. 程序调试 (三) —— Xcode Simulator的高级功能(二)

开始

首先我们看下写作内容:

了解如何释放Xcode在缓存,derived dataarchivessimulators中占用的空间。内容来自翻译

下面就是写作环境了

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,然后进行构建和运行。

通过使用NASAAstronomy Picture of the Day APIStellar 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

点击GoFinder窗口的路径更改为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 Spacedebug版本。 但是archived release版本存储在其他位置。


Clearing Archives

每当您archive要在TestFlightApp Storedistribution的应用程序时,该archive都将本地存储在Mac上。 您可能有多年的archive等待清理。

在本部分中,您将archive Stellar Space,然后从Mac中删除该存档,以节省宝贵的存储空间。 但是首先,您需要准备Stellar Space进行代码签名。

1. Archiving Stellar Space

Xcode中,请按照以下步骤操作,以获取Stellar SpaceSigning and Capabilities设置:

  • 1) 在项目导航器中,选择Stellar Space
  • 2) 在Targets下选择Stellar Space
  • 3) 选择Signing & Capabilities选项卡。

当前,用于archive Stellar SpaceTeam设置为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

在将您的应用archiveXcode中之前,您可能会在模拟器上运行它以测试您的应用。接下来,您将学习如何清除这些模拟器并删除旧数据。


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时,通常会附带新版本的XcodeiOS。 这些新的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设备支持,但是watchOStvOS遵循类似的模式。

2. Other Platforms

iOS文件一样,您可以在〜/ Library / Developer / Xcode / watchOS DeviceSupport中找到watchOS支持文件。 XcodetvOS设备支持文件存储在〜/ Library / Developer / Xcode / tvOS DeviceSupport中。

如果您尚未出于开发目的将Apple Watch连接到Mac,则将没有watchOS DeviceSupport文件夹。同样适用于iOStvOS


Caches

寻找空间节省的最后一个地方是各种缓存。

缓存存储数据,因此使用缓存的程序可以运行得更快,而无需重新计算缓存中的数据。

缓存始终是瞬态的,这意味着缓存中包含的数据是临时的。删除缓存的数据不会产生不利影响,因为创建缓存的程序可以随时重新生成它。但是对于较大的缓存,重建缓存时可能会遇到延迟。

删除缓存是回收空间的常用策略。例如,当删除Xcode的缓存时,所有未使用的旧数据将保持删除状态。 Xcode可以在以后重新生成它仍然需要的任何东西。

如果您在使用Xcode或其相关工具之一时遇到问题,清除缓存也可以帮助解决此问题。

大多数缓存都存储在〜/ Library / Caches中,包括Xcode缓存。您可以在〜/ Library / Caches / com.apple.dt.Xcode中找到Xcode的缓存。

1. Supporting Caches

另外两个值得注意的缓存是CarthageCocoaPods的缓存。 这些依赖项管理器可帮助您管理您可能在应用程序中使用的第三方库。

如果您使用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) 删除XcodeCarthage的缓存(如果存在)。
  • 5) 检查此计算机上是否安装了CocoaPods
  • 6) 如果安装了CocoaPods,清理CocoaPods cache

接下来,保存文件。 在TextEdit中,通过单击File ▸ SaveTextEdit的菜单栏中进行此操作。

您已经创建了脚本,几乎可以尝试了。

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内存管理,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容