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快取記憶體快取記憶體
- 多核cpu、cpu快取記憶體、快取一致性協議、快取行、記憶體快取記憶體協議
- 記憶體快取選型記憶體快取
- SDWebImage的快取策略Web快取
- CPU快取和記憶體屏障快取記憶體
- docker部署redis快取記憶體DockerRedis快取記憶體
- 談談CPU快取記憶體快取記憶體
- django 快取表格到記憶體Django快取記憶體
- Go:記憶體管理與記憶體清理Go記憶體
- Java記憶體快取-通過Google Guava建立快取Java記憶體快取GoGuava
- MRAM快取記憶體的組成快取記憶體
- 高效能記憶體快取 ristretto記憶體快取
- ASP.NET Core - 快取之記憶體快取(下)ASP.NET快取記憶體
- ASP.NET Core - 快取之記憶體快取(上)ASP.NET快取記憶體
- Python中pycharm如何清理快取?PythonPyCharm快取
- Java記憶體快取-通過Map定製簡單快取Java記憶體快取
- Oracle Exadata與SGA快取記憶體CQOracle快取記憶體
- 建立快取記憶體機制-java版快取記憶體Java
- 突然掛了!Redis快取都在記憶體中,這下完了!Redis快取記憶體
- 淺談快取寫法(三):記憶體快取該如何設計快取記憶體
- windows記憶體清理工具Windows記憶體
- windows 備用記憶體清理Windows記憶體
- linux清理快取Linux快取
- 清理 Conda 快取和 Pip 快取快取
- 快取記憶體一致性協議MESI與記憶體屏障快取記憶體協議
- win10怎麼清理記憶體_windows10系統清理記憶體教程Win10記憶體Windows
- TMCache原始碼分析(一)—TMMemoryCache記憶體快取原始碼記憶體快取
- TMCache原始碼分析(一)---TMMemoryCache記憶體快取原始碼記憶體快取
- 快取及使用 Circuit Breaker 限制記憶體使用快取UI記憶體
- laravel redirect快閃記憶體blade讀取不到Laravel記憶體
- pbootcms模板自動清理runtime快取,自動清理快取boot快取
- iOS 記憶體管理iOS記憶體
- 如何定期清理DNS快取?清理DNS快取有什麼用?DNS快取
- 直接記憶體和堆記憶體誰快記憶體
- Android 記憶體快取框架 LruCache 的原始碼分析Android記憶體快取框架原始碼
- Linux系統手動釋放記憶體快取Linux記憶體快取