一. 緩存的簡(jiǎn)單介紹
- App中的緩存, 都是存放在Caches文件夾中, 該文件夾專門用于保存App在運(yùn)行時(shí)產(chǎn)生的, 需要持久化的數(shù)據(jù). 隨著App的不斷使用, 網(wǎng)絡(luò)數(shù)據(jù)的加載, 該文件會(huì)越來越大, 導(dǎo)致App占用的磁盤內(nèi)存也越拉越大, 因此要定時(shí)清理
- 緩存的類型
- 在使用App過程中緩存的圖片
- 使用WebView等瀏覽器控件產(chǎn)生的網(wǎng)頁(yè)緩存
- 使用了一些第三方框架或者自己寫的, 將一些反復(fù)使用的數(shù)據(jù)做的緩存
二. 清理方法一: 暴力清除緩存
- 該方法的清理方式比較暴力, 是直接獲取Caches文件夾, 并且遍歷該文件夾下的所有子目錄(包括文件夾/文件), 然后清除所有的文件
- 該方法的步驟:
使用異步并發(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)雅的清理
與暴力清理方法的根本區(qū)別, 就是第二個(gè)方法不會(huì)連文件夾也一起清理掉
鄙人將獲取文件夾尺寸和刪除文件拆分為兩個(gè)方法, 并且歸于工具類使用
-
作為工具類, 為了更好的協(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];
}