版本記錄
版本號 | 時間 |
---|---|
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
內存管理,感興趣的給個贊或者關注~~~