iOS 除SDWebImage之外清理內(nèi)存中緩存

網(wǎng)絡(luò)圖片

最近換了新的公司,已經(jīng)兩個月沒有記錄過東西了,慚愧慚愧。剛好今天在做清理緩存的功能,順便記錄一下:

通常APP中清理緩存主要分為兩大類:
1.通過SDWebImage加載的圖片文件緩存
2.通過NSFileManager計算緩存文件夾內(nèi)的緩存并清理
SD的緩存清理網(wǎng)上有很多,所以今天我這里主要寫下第二種方式;

直接貼出代碼解釋:

//清除緩存按鈕的點擊事件
 //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 注意清理的路徑 否則可能造成自動登錄設(shè)置也失效
 [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實現(xiàn)對文件的管理
    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;
        }
        // 將大小轉(zhuǎn)化為M
        return size / 1024.0 / 1024.0;
    }
    return 0;
}
// 根據(jù)路徑刪除文件
- (void)cleanCaches:(NSString *)path{
    // 利用NSFileManager實現(xiàn)對文件的管理
    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路徑去計算相應(yīng)文件夾下的內(nèi)容的大小,上面注釋掉的部分其實只占用了很小的空間,但是存儲的信息確非常關(guān)鍵,比如我們平時經(jīng)常用到的NSUserDefaults中的數(shù)據(jù) 如果計算的時候加上這個路徑。并且在調(diào)用清除方法

 [self cleanCaches:"路徑"];

也寫入這個路徑的話 NSUserDefaults中存儲的信息也會丟失,例如我們平??赡鼙4娴挠脩糇詣拥卿浀男畔O扥,所以這里在計算緩存size和清理時要格外注意,可根據(jù)自己的需要進(jìn)行調(diào)整。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,211評論 3 119
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,262評論 8 265
  • 確認(rèn)過微信,你就說是狗改不了吃屎的人。坐在沙發(fā)上哆嗦了幾下,我試著讓自己再貼近現(xiàn)實,所以,這就是偷窺的得吸引力,沒...
    稻草垛下的小孩閱讀 195評論 0 0
  • 青葉覺得自己一定是受到了蠱惑,因為他并不打算通知小芳他已經(jīng)回來。這種荒唐的理由讓他好受一點。今晚的月光很好,清澈,...
    我是大水溝閱讀 535評論 0 0
  • 可惜有趣的靈魂太少 不知道是什么原因 我沒有反思 和他相處就那么難嗎 你一點都不特別 你既沒有好看的皮囊 也沒有有...
    迷兒不迷閱讀 453評論 0 0

友情鏈接更多精彩內(nèi)容