iOS 除SDWebImage之外清理記憶體中快取
最近換了新的公司,已經兩個月沒有記錄過東西了,慚愧慚愧。剛好今天在做清理快取的功能,順便記錄一下:
通常APP中清理快取主要分為兩大類:
1.通過SDWebImage載入的圖片檔案快取
2.通過NSFileManager計算快取資料夾內的快取並清理
SD的快取清理網上有很多,所以今天我這裡主要寫下第二種方式;
直接貼出程式碼解釋:
//清除快取按鈕的點選事件
//2018.08.02 注意這個路徑下東西輕易不要刪 所以不加入計算
//[self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject] +
CGFloat size = [self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject] + [self folderSizeAtPath:NSTemporaryDirectory()];
NSString *message = size > 1 ? [NSString stringWithFormat:@"快取%.2fM, 確定刪除?", size] : [NSString stringWithFormat:@"快取%.2fK, 確定刪除?", size * 1024.0];
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"確定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {
//2018.08.02 注意清理的路徑 否則可能造成自動登入設定也失效
[self cleanCaches:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject];
[self.view makeToast:@"清除快取成功!" duration:1.5 position:CSToastPositionCenter];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:nil];
[alert addAction:action];
[alert addAction:cancel];
dispatch_async(dispatch_get_main_queue(), ^{
[self showDetailViewController:alert sender:nil];
});
// 計算目錄大小
- (CGFloat)folderSizeAtPath:(NSString *)path{
// 利用NSFileManager實現對檔案的管理
NSFileManager *manager = [NSFileManager defaultManager];
CGFloat size = 0;
if ([manager fileExistsAtPath:path]) {
// 獲取該目錄下的檔案,計算其大小
NSArray *childrenFile = [manager subpathsAtPath:path];
for (NSString *fileName in childrenFile) {
NSString *absolutePath = [path stringByAppendingPathComponent:fileName];
size += [manager attributesOfItemAtPath:absolutePath error:nil].fileSize;
}
// 將大小轉化為M
return size / 1024.0 / 1024.0;
}
return 0;
}
// 根據路徑刪除檔案
- (void)cleanCaches:(NSString *)path{
// 利用NSFileManager實現對檔案的管理
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {
// 獲取該路徑下面的檔名
NSArray *childrenFiles = [fileManager subpathsAtPath:path];
for (NSString *fileName in childrenFiles) {
// 拼接路徑
NSString *absolutePath = [path stringByAppendingPathComponent:fileName];
// 將檔案刪除
[fileManager removeItemAtPath:absolutePath error:nil];
}
}
}
這裡重點講下第一步計算size大小要注意的,可以看到這裡:
CGFloat size = [self folderSizeAtPath:NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject] + [self folderSizeAtPath:NSTemporaryDirectory()];
其實是傳遞兩個path路徑去計算相應資料夾下的內容的大小,上面註釋掉的部分其實只佔用了很小的空間,但是儲存的資訊確非常關鍵,比如我們平時經常用到的NSUserDefaults中的資料 如果計算的時候加上這個路徑。並且在呼叫清除方法
[self cleanCaches:"路徑"];
也寫入這個路徑的話 NSUserDefaults中儲存的資訊也會丟失,例如我們平常可能儲存的使用者自動登入的資訊扥扥,所以這裡在計算快取size和清理時要格外注意,可根據自己的需要進行調整。
相關文章
- iOS開發之記憶體與快取iOS記憶體快取
- SDWebImage 快取機制(筆記)Web快取筆記
- CPU快取記憶體快取記憶體
- 由於快取圖片(SDWebImage)產生的記憶體警告一種處理快取Web記憶體
- Glide - 記憶體快取與磁碟快取IDE記憶體快取
- 多核cpu、cpu快取記憶體、快取一致性協議、快取行、記憶體快取記憶體協議
- DDD 和 記憶體快取記憶體快取
- SDWebImage清除快取Web快取
- Android記憶體優化之記憶體快取Android記憶體優化快取
- docker部署redis快取記憶體DockerRedis快取記憶體
- 談談CPU快取記憶體快取記憶體
- CPU快取和記憶體屏障快取記憶體
- iOS快取清理功能的實現iOS快取
- SDWebImage的快取策略Web快取
- Java記憶體快取-通過Google Guava建立快取Java記憶體快取GoGuava
- Go:記憶體管理與記憶體清理Go記憶體
- 高效能記憶體快取 ristretto記憶體快取
- MRAM快取記憶體的組成快取記憶體
- ASP.NET Core - 快取之記憶體快取(上)ASP.NET快取記憶體
- ASP.NET Core - 快取之記憶體快取(下)ASP.NET快取記憶體
- 清理linux記憶體Linux記憶體
- Java記憶體快取-通過Map定製簡單快取Java記憶體快取
- 突然掛了!Redis快取都在記憶體中,這下完了!Redis快取記憶體
- SDWebImage實現圖片展示、快取、清除快取Web快取
- iOS 中的記憶體管理iOS記憶體
- 建立快取記憶體機制-java版快取記憶體Java
- 記憶體資料庫快取介紹記憶體資料庫快取
- 【Linux】Linux 的快取記憶體Linux快取記憶體
- iOS開發-清理快取功能的實現iOS快取
- Python中pycharm如何清理快取?PythonPyCharm快取
- 淺談快取寫法(三):記憶體快取該如何設計快取記憶體
- windows 備用記憶體清理Windows記憶體
- windows記憶體清理工具Windows記憶體
- Ubuntu下如何清理記憶體Ubuntu記憶體
- SDWebImage載入gif超級耗記憶體Web記憶體
- 快取記憶體一致性協議MESI與記憶體屏障快取記憶體協議
- win10怎麼清理記憶體_windows10系統清理記憶體教程Win10記憶體Windows
- 快取及使用 Circuit Breaker 限制記憶體使用快取UI記憶體