iOS之缓存清理

作为一个开发者,对于缓存的清理也是理所应当的需要的。这次就简单的谈一下iOS中对于缓存的清理方法。

我们清理缓存通常是在这三种方式下进行的:

(1)项目中的清理缓存按钮

(2)点击退出app按钮时清理缓存

(3)手动杀死进程  (说明:我们使用苹果手机时,大部分人并不喜欢每次都去点击退出app按钮。所以客户就有了在我们手动杀死进程时,对app进行缓存清理的要求)

接下来我们就从这三种方面来分析iOS的清理缓存。

我们知道iOS应用是在沙箱(sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件:

  • Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
  • tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
  • Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

项目中的清理缓存按钮的代码就不列出了(我们可以在视图上直接添加Button,也可以在tableView上列出一个cell做清理缓存按钮),下面我直接给出清理缓存的代码

1、Caches目录的缓存一

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #8b8dea }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #76c2ff }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #3fa7ad }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px "PingFang SC"; color: #7d7e7e }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #7d7e7e }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0; min-height: 20.0px }
span.s1 { }
span.s2 { font: 17.0px "PingFang SC" }
span.s3 { color: #3fa7ad }
span.s4 { color: #bdb2a0 }
span.s5 { color: #c66576 }
span.s6 { color: #76c2ff }
span.s7 { color: #00b1ff }
span.s8 { color: #8b87ff }
span.s9 { font: 17.0px Menlo; color: #bdb2a0 }
span.s10 { font: 17.0px Menlo }
span.s11 { color: #7d7e7e }
span.s12 { font: 17.0px "PingFang SC"; color: #7d7e7e }
span.s13 { color: #ab4547 }
span.s14 { color: #9a4dc7 }

#pragma mark - ************* Get cache size(计算数据缓存)*************

- (NSString *)getCacheSize{

NSFileManager *fileManager = [NSFileManager defaultManager];

NSArray *paths = nil;

paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSMutableString *cachepath = [paths objectAtIndex:0];

NSError *error = nil;

//文件夹下所有的目录和文件大小

float cacheSize = 0.0f;

//fileList便是包含有该文件夹下所有文件的文件名及文件夹名的数组

NSArray *fileList = [fileManager contentsOfDirectoryAtPath:cachepath error:&error];

BOOL isDir = NO;

//在上面那段程序中获得的fileList中列出文件夹名

for (NSString *file in fileList) {

NSString *path = [cachepath stringByAppendingPathComponent:file];

[fileManager fileExistsAtPath:path isDirectory:(&isDir)];

//获取文件属性

NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:path error:nil];//[[NSFileManager defaultManager] fileAttributesAtPath: path traverseLink: YES];

//获取文件的创建日期

NSDate *modificationDate = (NSDate*)[fileAttributes objectForKey: NSFileModificationDate];

int timeSepearte = (int)[[NSDate date] timeIntervalSince1970]-(int)[modificationDate timeIntervalSince1970];

if (timeSepearte>(3*86400)) {

if ([fileManager isDeletableFileAtPath:path]) {

[fileManager removeItemAtPath:path error:nil];

}

}else{

if (isDir) {

cacheSize = cacheSize + [self fileSizeForDir:path];

}

}

isDir = NO;

}

NSString *cacheSizeString = @"";

if (cacheSize >1024*1024) {

float cacheSize_M = cacheSize/(1024*1024);

cacheSizeString = [NSString stringWithFormat:@"%.1f M",cacheSize_M];

}else if (cacheSize>1024&&cacheSize<1024*1024) {

float cacheSize_KB = cacheSize/(1024);

cacheSizeString = [NSString stringWithFormat:@"%.1f KB",cacheSize_KB];

}else{

float cacheSize_BYT = cacheSize/(1024);

cacheSizeString = [NSString stringWithFormat:@"%.1f B",cacheSize_BYT];

}

return cacheSizeString;

}

-(float)fileSizeForDir:(NSString*)path//计算文件夹下文件的总大小

{

NSFileManager *fileManager = [[NSFileManager alloc] init];

float size =0;

NSArray* array = [fileManager contentsOfDirectoryAtPath:path error:nil];

for(int i = 0; i<[array count]; i++)

{

NSString *fullPath = [path stringByAppendingPathComponent:[array objectAtIndex:i]];

BOOL isDir;

if ( !([fileManager fileExistsAtPath:fullPath isDirectory:&isDir] && isDir) )

{

NSDictionary *fileAttributeDic=[fileManager attributesOfItemAtPath:fullPath error:nil];

size+= fileAttributeDic.fileSize;

}

else

{

[self fileSizeForDir:fullPath];

}

}

return size;

}

2、Cache目录的缓存 二

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #8b8dea }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px "PingFang SC"; color: #7d7e7e }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0; min-height: 20.0px }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #7d7e7e }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #76c2ff }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #3fa7ad }
span.s1 { }
span.s2 { font: 17.0px "PingFang SC" }
span.s3 { color: #3fa7ad }
span.s4 { font: 17.0px Menlo; color: #bdb2a0 }
span.s5 { font: 17.0px Menlo }
span.s6 { color: #c66576 }
span.s7 { color: #8b87ff }
span.s8 { color: #bdb2a0 }
span.s9 { color: #ab4547 }
span.s10 { color: #76c2ff }
span.s11 { color: #7d7e7e }
span.s12 { font: 17.0px "PingFang SC"; color: #7d7e7e }

#pragma mark - 计算缓存大小

- (NSString *)getCacheSize1

{

//定义变量存储总的缓存大小

long long cacheSize = 0;

//01.获取当前图片缓存路径

NSString *cacheFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];

//02.创建文件管理对象

NSFileManager *filemanager = [NSFileManager defaultManager];

//获取当前缓存路径下的所有子路径

NSArray *subPaths = [filemanager subpathsOfDirectoryAtPath:cacheFilePath error:nil];

//遍历所有子文件

for (NSString *subPath in subPaths) {

//1).拼接完整路径

NSString *filePath = [cacheFilePath stringByAppendingFormat:@"/%@",subPath];

//2).计算文件的大小

long long fileSize = [[filemanager attributesOfItemAtPath:filePath error:nil]fileSize];

//3).加载到文件的大小

cacheSize += fileSize;

}

float size_m = cacheSize/(1024*1024);

return [NSString stringWithFormat:@"%.2fM",size_m];

}

清理缓存:

- (void)cleanCache

{

//清理缓存

NSFileManager *manager = [NSFileManager defaultManager];

NSArray *paths = nil;

paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSMutableString *cachepath = [paths objectAtIndex:0];

NSError *error = nil;

NSArray *fileList = [manager contentsOfDirectoryAtPath:cachepath error:&error];

for (NSString *file in fileList) {

NSString *path = [cachepath stringByAppendingPathComponent:file];

if ([manager isDeletableFileAtPath:path]) {

[manager removeItemAtPath:path error:nil];

}

}

}

3、NSUserDefaults (适合存储轻量级的本地数据),存储文件的清理

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0; min-height: 20.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #3fa7ad }
span.s1 { }
span.s2 { color: #c66576 }
span.s3 { color: #bdb2a0 }
span.s4 { color: #76c2ff }
span.s5 { color: #3fa7ad }

- (void)cleanCache

{

NSUserDefaults *defatluts = [NSUserDefaults standardUserDefaults];

NSDictionary *dictionary = [defatluts dictionaryRepresentation];

for(NSString *key in [dictionary allKeys]){

[defatluts removeObjectForKey:key];

[defatluts synchronize];

}

}

以上就是关于iOS缓存的内容。

这篇不错的文章可以看下:

iOS学习之IOS沙盒(sandbox)机制和文件操作

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0 }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #7d7e7e }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #3fa7ad }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #76c2ff }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #bdb2a0; min-height: 20.0px }
span.s1 { }
span.s2 { color: #c66576 }
span.s3 { color: #bdb2a0 }
span.s4 { font: 17.0px "PingFang SC" }
span.s5 { color: #76c2ff }
span.s6 { color: #3fa7ad }
span.s7 { color: #00b1ff }
span.s8 { color: #8b87ff }
span.s9 { color: #58c9c5 }
span.s10 { color: #ab4547 }
span.s11 { font: 17.0px "PingFang SC"; color: #ab4547 }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #7d7e7e }
span.s1 { }

时间: 2024-08-26 18:41:29

iOS之缓存清理的相关文章

iOS缓存清理思路的实现

首先在讲缓存清理之前讲讲文件管理的几个知识点 第一部分 文件管理几个常用的方法 一 比较两个文件的内容是否一样 /* -contentsEqualAtPath:andPath: does not take into account data stored in the resource fork or filesystem extended attributes. */ - (BOOL)contentsEqualAtPath:(NSString *)path1 andPath:(NSString

iOS图片缓存库基准对比

原文:iOS image caching. Libraries benchmark (SDWebImage vs FastImageCache),译者夜微眠(github地址),校对蓝魂(博客).Cocoa(博客).1.引言 过 去的几年里,iOS应用在视觉方面越来越吸引人.图像展示是其中很关键的部分,因为大部分图像展示都需要下载并且渲染.大部分开发者都要使用图像填充表格 视图(table views) 或者 集合视图(collection views) .下载图片消耗一些资源(如蜂窝数据.电池

手机卫士11_ 自定义控件_缓存清理_病毒库更新

拷贝安卓源码中的逻辑,可以考虑先创建一个小项目实现以下效果 1,病毒数据库的自动更新(连接网络,然后获取特征码保存到数据库?) ①工程师发现病毒apk,获取到它的特征码发布到服务器上 通过 MD5 或者ASH1获取特征码 ②客户端杀毒软件下载特征码(可能是 JSON串)到本地客户端 (在打开软件的时候还是打开查杀界面的时候?其实都不适合,应该开启一个服务去定期更新数据库,访问病毒更新特征码地址) 定期更新,timer和timertask,一般一个小时更新一次(测试的时候写短一点) 连接服务器:U

PHP7 opcache缓存清理问题

PHP7 opcache缓存清理问题 背景 OPcache通过opcode的缓存和优化,提供更快的PHP执行过程.业务在php7环境运营时,为了提升请求的性能,在PHP7环境中配置OPcache扩展.业务在更新代码后,访问业务系统时提示无法找到对应的文件或请求的内容还是更新前的旧内容,webserver重启以后,请求访问到的文件就都是最新的了,问题就貌似解决了. 问题分析 根据现象分析,代码更新后请求找不到新增的文件,尤其是还在请求已有文件更新前的内容,那么可能跟缓存有关系,考虑到跟业务代码逻辑

iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

iOS网络缓存扫盲篇 --使用两行代码就能完成80%的缓存需求 下篇预告:使用80%的代码来完成剩下的20%的缓存需求 .敬请 star (右上角)持续关注. 目录 当我们在谈论缓存的时候,我们在谈论什么? GET网络请求缓存 80%的缓存需求:两行代码就可满足 控制缓存的有效性 文件缓存:借助ETag或Last-Modified判断文件缓存是否有效 Last-Modified ETag 总结 一般数据类型借助 Last-Modified 与 ETag 进行缓存 剩下20%的网络缓存需求--真的

iOS 通用缓存:HanekeSwift

iOS 通用缓存:HanekeSwift Haneke 是个采用 Swift 编写的轻量级 iOS 通用缓存.示例: 初始化一个数据缓存: let cache = Cache<NSData>("my-files") Haneke 同时包括一个零配置的图片缓存,可以自动缩放. 示例: imageView.hnk_setImageFromURL(url) 它的设计是超简单易用.这里是你如何初始化一个JSON缓存和从URL获取JSON对象: let cache = Cache&l

手机安全卫士——缓存清理

CleanCacheActivity.java /** * 缓存清理*/ public class CleanCacheActivity extends Activity { private PackageManager packageManager; private List<CacheInfo> cacheLists; private ListView list_view; @Override protected void onCreate(Bundle savedInstanceStat

Android Glide数据更新及内存缓存、硬盘缓存清理

[转] 原文                                         Android Glide数据更新及内存缓存.硬盘缓存清理 Android的Glide在加载图片时候内部默认使用了缓存机制,Glide的缓存机制分为两级,第一级是内存缓存,然后第二级是硬盘缓存.缓存的过程首先是在内存中缓存,然后将加载的图片资源缓存到硬盘,这样就可以在随后的再次加载中使用缓存了,Glide使用缓存时候首先要检查内存这一层级是否缓存了相应的缓存,如果有,则直接使用,如果没有,则深入到硬盘缓

Hibernate中的脏检查和缓存清理机制

脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 脏数据检查: 什么是脏数据?脏数据并不是废弃和无用的数据,而是状