清理App的緩存

一. 緩存的簡(jiǎn)單介紹

  1. App中的緩存, 都是存放在Caches文件夾中, 該文件夾專門用于保存App在運(yùn)行時(shí)產(chǎn)生的, 需要持久化的數(shù)據(jù). 隨著App的不斷使用, 網(wǎng)絡(luò)數(shù)據(jù)的加載, 該文件會(huì)越來越大, 導(dǎo)致App占用的磁盤內(nèi)存也越拉越大, 因此要定時(shí)清理
  2. 緩存的類型
    • 在使用App過程中緩存的圖片
    • 使用WebView等瀏覽器控件產(chǎn)生的網(wǎng)頁(yè)緩存
    • 使用了一些第三方框架或者自己寫的, 將一些反復(fù)使用的數(shù)據(jù)做的緩存

二. 清理方法一: 暴力清除緩存

  1. 該方法的清理方式比較暴力, 是直接獲取Caches文件夾, 并且遍歷該文件夾下的所有子目錄(包括文件夾/文件), 然后清除所有的文件
  2. 該方法的步驟:
    • 使用異步并發(fā)隊(duì)列, 遍歷Caches文件夾下的所有路徑

    • 使用NSFileManager來獲取這些路徑的文件屬性

    • 通過文件屬性, 計(jì)算所有文件尺寸的大小, 展示給用戶當(dāng)前的緩存大小

    • 直接刪除遍歷到的每個(gè)文件

        // 多次遍歷使用異步并發(fā)隊(duì)列, 暴力方法, 會(huì)將或得到的所有路徑全部刪除, 包括文件夾路徑
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
            // 獲取caches文件夾路徑
            NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
            // 文件路徑遍歷器
            NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:cachePath];
            
            for (NSString *path in fileEnumerator) {
                // 這里注意要做個(gè)判斷, DS_Store是系統(tǒng)的文件, 沒有必要?jiǎng)h除他
                if ([path containsString:@"DS_Store"]) continue;
                
                // 拼接文件路徑
                NSString *filePath = [cachePath stringByAppendingPathComponent:path];
                // 獲取文件的屬性
                NSDictionary *fileAttr = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
                // 取出文件的尺寸, 拼接
                _totalSize += [fileAttr fileSize];
                
                // 保存所有的路徑
                [self.filePathArry addObject:filePath];
                
                // 刪除Caches中的所有文件
                [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
            }
        });
      

三. 清理方法二: 優(yōu)雅的清理

  1. 與暴力清理方法的根本區(qū)別, 就是第二個(gè)方法不會(huì)連文件夾也一起清理掉

  2. 鄙人將獲取文件夾尺寸和刪除文件拆分為兩個(gè)方法, 并且歸于工具類使用

  3. 作為工具類, 為了更好的協(xié)調(diào)團(tuán)隊(duì)開發(fā), 給別人使用的話最好在前面做一些防止異常的判斷處理

     + (NSInteger)getSizeOfDirectoryPath:(NSString *)directoryPath {
         
         NSFileManager *manager = [NSFileManager defaultManager];
         
         // 1. 判斷傳入的路徑是否為文件夾, 是否存在
         BOOL isDirectory = NO;
         BOOL isExists = [manager fileExistsAtPath:directoryPath isDirectory:&isDirectory];
         
         if (!isDirectory || !isExists) {
             NSException *exc = [NSException exceptionWithName:@"FilePathError" reason:@"傳入的路徑不合法" userInfo:nil];
             [exc raise];
         }
         
         // 2. 如果路徑存在, 獲取該路徑下的所有文件
         NSInteger totalSize = 0;
         NSArray *subPathArray = [manager subpathsOfDirectoryAtPath:directoryPath error:nil];
         
         for (NSString *subPath in subPathArray) {
             
             NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
             NSDictionary *fileAttr = [manager attributesOfItemAtPath:filePath error:nil];
             totalSize += [fileAttr fileSize];
         }
         
         return totalSize;
     }
     
     + (void)removeAllItemInDirectoryPath:(NSString *)directoryPath {
         
         NSFileManager *manager = [NSFileManager defaultManager];
         
         BOOL isDirectory = NO;
         BOOL isExists = [manager fileExistsAtPath:directoryPath isDirectory:&isDirectory];
         
         if (!isDirectory || !isExists) {
             
             NSException *exc = [NSException exceptionWithName:@"FilePathError" reason:@"傳入的路徑不合法" userInfo:nil];
             [exc raise];
         }
         
         // 此方法會(huì)忽略文件夾, 只獲取文件
         NSArray *subPathArray = [manager subpathsOfDirectoryAtPath:directoryPath error:nil];
         
         for (NSString *subPath in subPathArray) {
             NSString *filePath = [directoryPath stringByAppendingPathComponent:subPath];
             [manager removeItemAtPath:filePath error:nil];
         }
     }
    

四. 額外補(bǔ)充

補(bǔ)充一個(gè)用來展示當(dāng)前緩存為MB還是KB的小玩意, 使用NSFileManager獲取到的尺寸大小為bit, 所以要讓用戶理解的話, 還要自己進(jìn)一步做個(gè)加工

NSString *sizeStr = @"清除緩存";
if (size > 1000 * 1000) {

    CGFloat sizeMB = size / 1000.0 / 1000.0;
    sizeStr = [NSString stringWithFormat:@"%@(%.1fMB)", sizeStr, sizeMB];

} else if (size > 1000) {
    
    CGFloat sizeKB = size / 1000.0;
    sizeStr = [NSString stringWithFormat:@"%@(%.1fKB)", sizeStr, sizeKB];
} else if (size > 0) {
    
    sizeStr = [NSString stringWithFormat:@"%@(%ldB)", sizeStr, size];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挺狰,隨后出現(xiàn)的幾起案子琳轿,更是在濱河造成了極大的恐慌坚芜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洞焙,死亡現(xiàn)場(chǎng)離奇詭異葬凳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)键菱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來今布,“玉大人纱耻,你說我怎么就攤上這事∠找” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵玖喘,是天一觀的道長(zhǎng)甩牺。 經(jīng)常有香客問我,道長(zhǎng)累奈,這世上最難降的妖魔是什么贬派? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮澎媒,結(jié)果婚禮上搞乏,老公的妹妹穿的比我還像新娘。我一直安慰自己戒努,他們只是感情好请敦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著储玫,像睡著了一般侍筛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撒穷,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天匣椰,我揣著相機(jī)與錄音,去河邊找鬼端礼。 笑死禽笑,一個(gè)胖子當(dāng)著我的面吹牛入录,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佳镜,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼僚稿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了邀杏?” 一聲冷哼從身側(cè)響起贫奠,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎望蜡,沒想到半個(gè)月后唤崭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脖律,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年谢肾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片小泉。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芦疏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出微姊,到底是詐尸還是另有隱情酸茴,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布兢交,位于F島的核電站薪捍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏配喳。R本人自食惡果不足惜酪穿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴裹。 院中可真熱鬧被济,春花似錦、人聲如沸涧团。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泌绣。三九已至喳瓣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赞别,已是汗流浹背畏陕。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仿滔,地道東北人惠毁。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓犹芹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鞠绰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腰埂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • // //LYClearCache.h //清除緩存 // //Created by李瑜on 16/8/1. //...
    unwalled閱讀 424評(píng)論 0 1
  • 27、ViewController的didReceiveMemoryWarning是在什么時(shí)候調(diào)用的蜈膨?默認(rèn)的操作是...
    煙雨平生花飛舞閱讀 566評(píng)論 0 1
  • 清除緩存在每一個(gè)應(yīng)用是一個(gè)很常見的功能屿笼,今天這里小結(jié)一下。 將數(shù)據(jù)永久性的存儲(chǔ)我們稱為數(shù)據(jù)持久化翁巍,其本質(zhì)是將數(shù)據(jù)存...
    追逐_chase閱讀 530評(píng)論 0 1
  • 1驴一、文件的創(chuàng)建 -(IBAction) CreateFile { //對(duì)于錯(cuò)誤信息 NSError *error;...
    東引甌越閱讀 3,459評(píng)論 0 50
  • 一句話,一個(gè)承諾灶壶,一雙手肝断,一份溫暖。一個(gè)社會(huì)驰凛,不同意識(shí)胸懈,造就了變化萬千的世界。一群人恰响,一份熱情趣钱,一個(gè)行動(dòng),...
    李鍵成閱讀 194評(píng)論 0 0