程序調試 (四) —— 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內存管理,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容