一般app上都会在设置模块有清理缓存的功能。这里的缓存指的是磁盘缓存。在iOS系统上对应的是沙盒路径下的缓存。
一般清除缓存无非两样:图片缓存和其他资源文件缓存。
图片缓存的清理:
如果项目中用了SDWebImage,可以直接使用SDWebImage提供好的方法进行处理。
计算磁盘中的图片缓存大小(内存中的无需处理)
float folderSize;
//SDWebImage框架自身计算缓存的实现
folderSize = [[SDImageCache sharedImageCache] getSize]/1024.0/1024.0;
清理磁盘中的图片缓存
-(void)cleanCache{
[[SDImageCache sharedImageCache] cleanDisk];
}
我的项目中有单独的文件模块,类似于网盘这种的。支持各种文件的在线预览,而且每次预览后都会保存在沙盒中。对于沙盒中的文件清理是这样的:
计算沙盒中某路径的缓存大小
#pragma mark 清除缓存
-(NSString *)getCacheCount{
float folderSize;
if ([self.fileManager fileExistsAtPath: self.cachePath]) {
NSArray *childerFiles = [self.fileManager subpathsAtPath:self.cachePath];
for (NSString *fileName in childerFiles) {
NSString *absolutePath = [self.cachePath stringByAppendingPathComponent:fileName];
folderSize += [self fileSizeAtPath:absolutePath];
}
}
return [NSString stringWithFormat:@"%0.1f MB",folderSize];
}
-(float)fileSizeAtPath:(NSString *)path {
NSFileManager *fileManager=[NSFileManager defaultManager];
if([fileManager fileExistsAtPath:path]){
long long size=[fileManager attributesOfItemAtPath:path error:nil].fileSize;
return size/1024.0/1024.0;
}
return 0;
}
清理沙盒中某路径的缓存
-(void)cleanCache:(NSString *)path{
NSFileManager *fileManager=[NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:path]) {
NSArray *childerFiles=[fileManager subpathsAtPath:path];
for (NSString *fileName in childerFiles) {
//如有需要,加入条件,过滤掉不想删除的文件
NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
[fileManager removeItemAtPath:absolutePath error:nil];
}
}
}
最后补充一点缓存方面的小知识:按需缓存和预缓存。
应用需要离线工作的主要原因就是改善应用所表现出的性能。将应用内容缓存起来就可以支持离线。我们可以用两种不同的缓存来使应用离线工作。第一种是按需缓存,这种情况下应用缓存起请求应答,就和Web浏览器的工作原理一样;第二种是预缓存,这种情况是缓存全部内容(或者特定时间点的一些记录)以便离线访问。
按需缓存和预缓存,它们在设计和实现上有很大的不同。按需缓存是指把从服务器获取的内容以某种格式存放在本地文件系统,之后对于每次请求,检查缓存中是否存在这块数据,只有当数据不存在(或者过期)的情况下才从服务器获取。这样的话,缓存层就和处理器的高速缓存差不多。获取数据的速度比数据本身重要。而预缓存是把内容放在本地以备将来访问。对预缓存来说,数据丢失或者缓存不命中是不可接受的,比方用户下载了文章准备在地铁上看,但却发现设备上不存在这些文章(关于按需缓存和预缓存详情请移步https://my.oschina.net/u/1049180/blog/405639)