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

网络图片

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

通常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和清理时要格外注意,可根据自己的需要进行调整。


你可能感兴趣的:(iOS 除SDWebImage之外清理内存中缓存)