实现清除缓存,首先要了解是要清除哪里的缓存,所以我们先对一个app里面的文件有所了解。
查看app文件内容的方法:打开Xcode ->工具栏Window ->Devices ->选择设备->单击项目(双击也可以直接看到,要等10秒的样子才出现)->点击那个小东西选择Download Container,把他放到桌面上,就可以右击显示包内容了。


一个app里面由一个AppData文件夹,里面的内容为:
- Documents
用来保存创建程序产生的文件,及应用浏览产生的一些数据。itunes同步备份的时候,会把这个目录一起备份,所这个这目录可以用来存储一些定期备份的资料。
也是出于这个原因,我们开发的时候本地保存一些图片啊视频啊等东西最好不要放在这东西目录下,因为这样会大大地占用云空间(正常情况下我们的iCloud也就是云容量为5G,升级了的土豪当我什么也没说)。
获取该文件路径的方法:
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
- Library
里面有两个子目录
Caches和Preferences:Caches是用来保存缓存应用文件,关闭应用后不会丢失,不会同步到iTunes, 比较大的文可以保存在这里。Preferences: 保存应用程序的偏好设置文件,NSUserDefaults保存的东西也在这里,
下图为我写了
[[NSUserDefaults standardUserDefaults] setObject:@”汪凯” forKey:@”laojingxing”];这句代码后,在Preferences里面的plist看到的结果
获取该文件路径的方法:
NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
SDWebImage 就是把图片存放在Caches里面的,它自己还生成了一个转门的文件夹,如图,上面是没使用SDWebImage加载图片前的文件,下面是加载一张图片后的文件路径示意图
- tmp
用于存放临时文件,程序关闭后,里面的东西会删除掉。
获取该文件路径的方法:
NSString *tmpPath = NSTemporaryDirectory();
好了,了解完路径结构后,我们进入正题清楚缓存。
一般做这个功能都要先显示缓存有多大,再点击清楚除。对文件操作考虑到大文件的情况下会耗时间比较长,所在我用了GCD开辟多线程。能不逼逼咱就不逼逼,上代码:
获取缓存
+ (void)getCachesSize:(void (^)(NSString *))CompleteBlck
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSArray *allSubPathArray = [FileManager subpathsAtPath:path];
long long cachesSize = 0;
for (NSString *subPath in allSubPathArray) {
NSString *subPathString = [path stringByAppendingPathComponent:subPath];
NSDictionary *subCachesDic = [FileManager attributesOfItemAtPath:subPathString error:nil];
cachesSize += subCachesDic.fileSize;
}
double doubleCaches = (double)cachesSize / pow(10, 6);
CompleteBlck([NSString stringWithFormat:@"%.2f", doubleCaches]);
});
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
清除缓存
+ (void)cleanCaches:(void (^)(BOOL))CompleteBlock
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
BOOL isSuccess = NO;
NSArray *allSubPathArray = [FileManager subpathsAtPath:path];
for (NSString *subPath in allSubPathArray) {
NSString *subPathStrigng = [path stringByAppendingPathComponent:subPath];
if ([FileManager removeItemAtPath:subPathStrigng error:nil]) {
NSLog(@"成功");
isSuccess = YES;
} else {
NSLog(@"失败");
}
}
dispatch_async(dispatch_get_main_queue(), ^{
[self getCachesSize:^(NSString *cacheSize) {
if ([cacheSize floatValue] == 0) {
CompleteBlock(YES);
} else {
CompleteBlock(isSuccess);
}
}];
});
});
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
当然我们在实际开发中,会把一些视频啊,图片啊、声音啊保存到我们自己创建的文件文件夹里面,有需要删除指定文件夹下面的文件的时候
+ (void)cleanCachesAtPath:(NSString *)path completeBlock:(void(^)(BOOL isSuccess))CompleteBlock
{
if (![FileManager isExecutableFileAtPath:path]) {
NSLog(@"文件夹不存在");
CompleteBlock(NO);
return;
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
BOOL isSuccess = NO;
NSArray *allSubPathArray = [FileManager subpathsAtPath:path];
for (NSString *subPath in allSubPathArray) {
NSString *subPathStrigng = [path stringByAppendingPathComponent:subPath];
if ([FileManager removeItemAtPath:subPathStrigng error:nil]) {
isSuccess = YES;
} else {
}
}
dispatch_async(dispatch_get_main_queue(), ^{
[self getCachesSize:^(NSString *cacheSize) {
if ([cacheSize floatValue] == 0) {
CompleteBlock(YES);
} else {
CompleteBlock(isSuccess);
}
}];
});
});
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
有时候手机内容过少的时候,也可以像微信那样提示一下清楚缓存,传一个少于多少的时候,返回是否提示
+ (BOOL)remindCleanCache:(long long)lessThanSize
{
NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];
return [[fattributes objectForKey:NSFileSystemFreeSize] longLongValue] > lessThanSize ? NO : YES;
}