iOS清除缓存详细解析、app文件路径操作,真机沙盒理解

实现清除缓存,首先要了解是要清除哪里的缓存,所以我们先对一个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), ^{
        // 获取cache文件目录
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        // 获取该路径下的所有文件, 删除的时候,可以直接删除文件夹,计算的时候不能直接计算文件夹的大小, 所以用subpathsAtPath 方法。正好拿不到Snapshots。删除的时候也删除不了这里面的东西,所以刚好对上。
        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];
            // 得出的结果是B 最后要转成K 再转成 M
            cachesSize += subCachesDic.fileSize;
        }

        // 转成M, 保留两位小数。注意计算的时候进制是以1000计算,而不是1024。这也是为什么有些手机说是16G的内存,但实际容量只有14G左右。
        double doubleCaches = (double)cachesSize / pow(10, 6);
        // 传回去的是M,可以根据实际情况转换成K,或者G
        CompleteBlck([NSString stringWithFormat:@"%.2f", doubleCaches]);
    });

}

清除缓存

+ (void)cleanCaches:(void (^)(BOOL))CompleteBlock
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 获取cache文件目录
        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 {

                // Snapshots 本来就存在的文件夹删除不了,可以回去看一下没用SDWebImage之前的文件夹,caches文件夹里面本来就有Snapshots(快照)
                NSLog(@"失败");

            }
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self getCachesSize:^(NSString *cacheSize) {
                if ([cacheSize floatValue] == 0) {
                    // 本来就没有缓存,那也算成功
                    CompleteBlock(YES);
                } else {
                    CompleteBlock(isSuccess);
                }
            }];
        });

    });
}

当然我们在实际开发中,会把一些视频啊,图片啊、声音啊保存到我们自己创建的文件文件夹里面,有需要删除指定文件夹下面的文件的时候

+ (void)cleanCachesAtPath:(NSString *)path completeBlock:(void(^)(BOOL isSuccess))CompleteBlock
{
    if (![FileManager isExecutableFileAtPath:path]) {
        // 文件夹不存在
//        [[[UIAlertView alloc] initWithTitle:@"文件路径不存在" message:nil delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil] show];
        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]) {
//                NSLog(@"成功");
                isSuccess = YES;
            } else {
//                NSLog(@"失败");

            }
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self getCachesSize:^(NSString *cacheSize) {
                if ([cacheSize floatValue] == 0) {
                    // 本来就没有缓存,那也算成功
                    CompleteBlock(YES);
                } else {
                    CompleteBlock(isSuccess);
                }
            }];
        });

    });
}

有时候手机内容过少的时候,也可以像微信那样提示一下清楚缓存,传一个少于多少的时候,返回是否提示

+ (BOOL)remindCleanCache:(long long)lessThanSize
{
    NSDictionary *fattributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:NSHomeDirectory() error:nil];
    return [[fattributes objectForKey:NSFileSystemFreeSize] longLongValue] > lessThanSize ? NO : YES;
}

demo已上传gitHub点我下载
有什么问题及时纠正小弟,小弟不胜感激
PS:真机和模拟器有所出入,以上都是用真机演示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值