iOS 除SDWebImage之外清理内存中缓存

iOS 缓存清理

最近换了新的公司,已经两个月没有记录过东西了,惭愧惭愧。刚好今天在做清理缓存的功能,顺便记录一下:

通常APP中清理缓存主要分为两大类:
1.通过SDWebImage加载的图片文件缓存
2.通过NSFileManager计算缓存文件夹内的缓存并清理
SD的缓存清理网上有很多,所以今天我这里主要写下第二种方式;

直接贴出代码解释:

//清除缓存按钮的点击事件
 //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 注意清理的路径 否则可能造成自动登录设置也失效
 [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实现对文件的管理
    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;
        }
        // 将大小转化为M
        return size / 1024.0 / 1024.0;
    }
    return 0;
}
// 根据路径删除文件
- (void)cleanCaches:(NSString *)path{
    // 利用NSFileManager实现对文件的管理
    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路径去计算相应文件夹下的内容的大小,上面注释掉的部分其实只占用了很小的空间,但是存储的信息确非常关键,比如我们平时经常用到的NSUserDefaults中的数据 如果计算的时候加上这个路径。并且在调用清除方法

 [self cleanCaches:"路径"];

也写入这个路径的话 NSUserDefaults中存储的信息也会丢失,例如我们平常可能保存的用户自动登录的信息扥扥,所以这里在计算缓存size和清理时要格外注意,可根据自己的需要进行调整。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值