23 手机上内存清理

设置界面中清除缓存的处理 (抄录转载)

应用中清除缓存的处理

www.jianshu.com/p/1ee0761624a6

1

手机上的磁盘缓存 == 从网络上下载的数据 + 写入的数据

手机上的磁盘缓存的数据类型 == 图片 + 多媒体文件(音频/视频)

它们存在于沙盒中

这里要清除缓存,就要拿到沙盒中存在的缓存的大小,就是看我们下载的图片文件有多大,然后把它显示在cell当中

因为我们下载图片用到是SDWebImage框架,所以我们要获取所下载图片的缓存大小,最简单的方法也是使用SDWebImage里面的东西--SDImageCache

2

获取磁盘缓存的大小,它是一个单例,在mac和ios中,数据的大小不是以1024为单位的而是以1000为单位,不用弄混淆了

获取沙盒路径:

NSLog(@"%@",NSTemporaryDirectory());

单位是Mb

NSLog(@"%f",[SDWebImageCache sharedImageCache].getSize);


3沙盒结构

Documents 不允许存放大型文件,备份ITunes,缓存文件放这里边,是不允许通过的

Library:存放缓存文件(整个缓存在default文件夹)和用户偏好设置

temp:临时变量


4获取文件和文件夹大小

SDWebImage只用了一个类FileManager

只能获取文件的大小,不能获取整个文件夹 大小


//文件管理者

NSFileManager *mgr = [NSFileManager defaultManager];

//查找default文件夹,拿到路径

//先拿到Cache文件夹路径,返回的是个数组,取第一个

NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

NSString *file = [caches stringByAppendingPathComponent:@"default"];// 拼接的路径

//    NSString *file = [caches stringByAppendingString:@"default"];// 这是拼接的字符串


获取文件属性

// 它只给你文件夹这个壳子有多大,没有给里面的文件有多大

NSDictionary *attrs = [mgr attributesOfItemAtPath:file error:nil];

在Mac中不能直接拿到文件夹的大小,只能对文件夹进行一层一层的遍历,去拿到里面文件的大小,然后全部加起来

所以我们得遍历文件夹里面所以的文件,然后把里面所有文件的FileSize加起来


方法一:

// 总大小

NSInteger size = 0;

// 文件路径

// 先拿到caches文件夹路径(它返回的是数组,所以取第一个)

NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

NSString *file = [caches stringByAppendingPathComponent:@"default"];// 拼接的路径

//    NSString *file = [caches stringByAppendingString:@"default"];// 这是拼接的字符串

// 文件管理者

NSFileManager *mgr = [NSFileManager defaultManager];

// 获得文件夹中的所有内容

//        NSArray *contents = [mgr contentsOfDirectoryAtPath:file error:nil];

//        它只能获得它当前文件夹的内容,不能往里面深挖,这里不用它

//        subpaths 获取文件夹里面文件的子路径,什么文件都能拿到了(文件夹能拿到,文件夹里面的文件也能拿到)

//        所以用subpaths就是做好的,只要给我们一个最根的文件夹,我们就能找到里面所有的文件,不需要一遍一遍递归去找了

NSArray *subpaths = [mgr subpathsAtPath:file];

for (NSString *subpath in subpaths) {

// 获得全路径

NSString *fullSubpath = [file stringByAppendingPathComponent:subpath];

// 获得文件属性

NSDictionary *attrs = [mgr attributesOfItemAtPath:fullSubpath error:nil];

//        size += [attrs[NSFileSize] integerValue];

size += attrs.fileSize;

}

这个方式是通过拼接所有的路径而去获取缓存的大小


方法二:

// 总大小

NSInteger size = 0;

// 文件路径

NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

NSString *file = [caches stringByAppendingPathComponent:@"default"];

// 文件管理者

NSFileManager *mgr = [NSFileManager defaultManager];

// 获得文件夹中的所有内容

// enumerator遍历器,可以通过for..in..遍历所有的子路径

NSDirectoryEnumerator *enumerator = [mgr enumeratorAtPath:file];

for (NSString *subpath in enumerator) {

// 获得全路径

NSString *fullSubpath = [file stringByAppendingPathComponent:subpath];

// 获得文件属性

NSDictionary *attrs = [mgr attributesOfItemAtPath:fullSubpath error:nil];

//        size += [attrs[NSFileSize] integerValue];

//      通过key直接取出来

size += attrs.fileSize;

}

第二种方式的原理:怎么获取一个文件夹内容的大小,把一个文件夹给我,有了文件夹路径,有了manager,然后获得一个可以获取文件夹路径的遍历器,它通过for...in...可以遍历出所有文件夹的子路径。通过子路径生成一个完整的路径(全路径),我就获取所有子路径文件的大小。把它所有的文件夹大小加起来,就是我们总文件的大小。


5 SDWebImage实现:

- (NSUInteger)getSize {

__block NSUInteger size = 0;

dispatch_sync(self.ioQueue, ^{

NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath];

for (NSString *fileName in fileEnumerator) {

NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName];

NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];

size += [attrs fileSize];

}

});

return size;

}

SDWebImage底层在这里是怎么实现:把一个文件夹传进去,获取所有的迭代器,从迭代器中获取所有的子路径通过文件夹路径拼接一个文件名变成一个全路径,然后再通过attributes这个属性累加起来;但是,它是直接调用字典这种方法(我们是前面是通过key取出来的),而且是放在一个自己创建的一个串行队列中去的,也就是异步的

但是现在放在viewDidLoad中算,肯定是有问题的,比较耗时,我们得修改

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 1.在info中的bundle name修改app的名称 2.修改自定义返回按钮的位置,用button.conte...
    LiwaySun阅读 413评论 0 0
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • 1、禁止手机睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa阅读 1,114评论 1 6
  • 今年年初,设定了几个成长的主题,其中一个是改善亲密关系,跟妈妈更亲近。学习五行前,通过记录跟她之间的互动,尝试...
    卓韵悠悠阅读 913评论 0 0
  • 2007年8月30日早上,我和老爸到达成都。 成都那天是晴天,但是前一晚入川后,零零星星下了雨。出站后,没费多少功...
    牧雲阅读 172评论 0 0