ios nscacheios11什么时候更新自动删除

主题 : 大神们,问一个关于AFNetwroking本地NSURLCache和NSCache问题
级别: 新手上路
可可豆: 20 CB
威望: 20 点
在线时间: 40(时)
发自: Web Page
来源于&&分类
大神们,问一个关于AFNetwroking本地NSURLCache和NSCache问题&&&
请各位大神们讨论一下,AFNetworking中利用NSURLCache进行的本地缓存怎么样提取出来,用于重新打开应用后提取
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版2150人阅读
IOS-深入(183)
在ios中,苹果提供了,NSCache类和NSDictionary很相似,提供key,value的存储,不一样的是NSCache在内存吃紧的时候会做自动释放。
遇到一个问题是,在使用大量图片的app中,需要从存储里面读取数据,每次都从文件系统里面读取文件会造成卡顿现象。
解决办法就是把NSData对象缓存起来,先从NSCache里面读取数据,然后再从文件系统获取数据,提高效率。
方法如下:
步骤1:需要一个单例的NSCache,由于我们的FileUtil本来就是单例的,所以只是需要在初始化FileUtil的时候实例出一个NSCache就行了。
_cache = [[NSCache alloc] init];
步骤2:写文件的时候,把NSData存入NSCache里面
-(void)write:(NSData*)data forKey:(NSString*)key
NSString *filepath& = [self filePathForKey:key];
[_cache setObject:data forKey:key];
dispatch_async(fileQueue, ^{
[[NSFileManager defaultManager] createFileAtPath:filepath contents:data attributes:nil];
步骤3:读文件时候,先从NSCache里面读取,如果没有再从文件系统中读取。从文件系统中读取到的数据,再放回到NSCache中。
-(NSData*)readForKey:(NSString*)key
if(key==nil){
NSData *cacheData = [_cache objectForKey:key];
if(cacheData){
NSLog(@&get data from cache&);
return cacheD
NSLog(@&miss data from cache&);
NSString *filepath =[self filePathForKey:key];
NSData *fileData =& [[NSFileManager defaultManager] contentsAtPath:filepath];
if(fileData){
[_cache setObject:fileData forKey:key];
return fileD
总结:通过这样的方式,形成了 内存 -& 文件系统 &-& 网络图片 的三级图片访问系统。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:736761次
积分:11556
积分:11556
排名:第1314名
原创:333篇
转载:90篇
评论:85条
文章:15篇
阅读:19895
文章:17篇
阅读:17746
文章:17篇
阅读:68191
(1)(1)(1)(1)(1)(1)(1)(2)(1)(1)(1)(1)(1)(6)(3)(8)(5)(13)(23)(21)(14)(21)(19)(5)(29)(25)(39)(54)(33)(91)主题 : 关于NSCache的使用。
级别: 新手上路
可可豆: 250 CB
威望: 250 点
在线时间: 15(时)
发自: Web Page
关于NSCache的使用。&&&
关于NSCache的使用。   我是这样用的// 作为某个类的成员变量m_pCache = [[NSCache alloc] init];[m_pCache setName:@&NSCache_Name&];// 存取数据, 我放了一个NSArray进去。[m_pCache setObject:obj forKey:key];为什么每次, objectForKey在文档上的解释:Unlike an NSMutableDictionary object, a cache does not copy the key objects that are put into it.[m_pCache objectForKey:key];返回的数据都是空的?而在网上。。搜索也没有几个人使用nscache。。难道大家都不做内存cache吗?
级别: 精灵王
可可豆: 12897 CB
威望: 12897 点
在线时间: 857(时)
发自: Web Page
You may want to conform your &obj& to NSDiscardableContent protocol.
级别: 侠客
UID: 74808
可可豆: 435 CB
威望: 433 点
在线时间: 79(时)
发自: Web Page
NSCache&&不会copy对象 也不会retain对象&&所以在内存不足的时候 NSCache 中的对象会被释放掉
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版3139人阅读
NSCache 是苹果官方提供的缓存类,用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,使用它来管理缓存
NSCache 在系统内存很低时,会自动释放一些对象
备注:这句话源自苹果的官方文档,不过在模拟器中模拟内存警告时,缓存不会做清理动作
为了确保接收到内存警告时能够真正释放内存,最好调用一下 removeAllObjects 方法
NSCache 是线程安全的,在多线程操作中,不需要对 Cache 加锁
NSCache 的 Key 只是做强引用,不需要实现 NSCopying 协议
totalCostLimit
缓存空间的最大总成本,超出上限会自动回收对象
默认值是 0,表示没有限制
countLimit
能够缓存对象的最大数量
默认值是 0,表示没有限制
evictsObjectsWithDiscardedContent
标示缓存是否回收废弃的内容
默认值是 YES,表示自动回收
-objectForKey: 返回与键值关联的对象
-setObject:forKey:
在缓存中设置指定键名对应的值
与可变字典不同,缓存对象不会对键名做 copy 操作
-setObject:forKey:cost:
在缓存中设置指定键名对应的值,并且指定该键值对的成本
成本 (cost) 用于计算记录在缓冲中的所有对象的总成本
置对象并指定”成本”,成本可以自行指定
啥叫成本?
例子:缓存图片
缓存 100 张图片
将图片的”宽 * 高”当作成本,图像”像素”
10M 当作缓存成本,无论缓存的多少张照片,只要像素值超过 10M,就自动清理
缓存图像的时候,使用成本,比单纯设置数量要科学!
(void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
当出现内存警告时,或者超出缓存的总成本上限时,缓存会开启一个回收过程,删除部分元素
-removeObjectForKey:
删除缓存中,指定键名的对象
-removeAllObjects
删除缓存中所有对象(很可怕,最好别用)
cache:willEvictObject
缓存将要删除对象时调用
不能在此方法中修改缓存
需要实现NSCacheDelegate
@interface ViewController () &NSCacheDelegate&
实现代理方法:
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
[NSThread sleepForTimeInterval:0.5];
NSLog(@"清除了-------& %@", obj);
声明NSCache变量:
@property (nonatomic, strong) NSCache *
- (NSCache *)cache {
if (_cache == nil) {
_cache = [[NSCache alloc] init];
// 设置数量限制,最大限制为10
_cache.countLimit = 10;
_cache.delegate = self;
测试Demo:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
for (int i = 0; i & 20; ++i) {
NSString *str = [NSString stringWithFormat:@"hello - %04d", i];
NSLog(@"设置 %@", str);
[self.cache setObject:str forKey:@(i)];
for (int i = 0; i & 20; ++i) {
NSLog(@"缓存中-----&%@", [self.cache objectForKey:@(i)]);
运行结果:
2015 09:27:19.953 01演练[] 设置
2015 09:27:19.954 01演练[] 设置
2015 09:27:19.954 01演练[] 设置
2015 09:27:19.954 01演练[] 设置
2015 09:27:19.954 01演练[] 设置
2015 09:27:19.954 01演练[] 设置
2015 09:27:19.954 01演练[] 设置
2015 09:27:19.955 01演练[] 设置
2015 09:27:19.955 01演练[] 设置
2015 09:27:19.955 01演练[] 设置
2015 09:27:19.955 01演练[] 设置
2015 09:27:20.456 01演练[] 清除了&
2015 09:27:20.457 01演练[] 设置
2015 09:27:20.957 01演练[] 清除了&
2015 09:27:20.957 01演练[] 设置
2015 09:27:21.458 01演练[] 清除了&
2015 09:27:21.459 01演练[] 设置
2015 09:27:21.959 01演练[] 清除了&
2015 09:27:21.959 01演练[] 设置
2015 09:27:22.461 01演练[] 清除了&
2015 09:27:22.461 01演练[] 设置
2015 09:27:22.962 01演练[] 清除了&
2015 09:27:22.962 01演练[] 设置
2015 09:27:23.464 01演练[] 清除了&
2015 09:27:23.464 01演练[] 设置
2015 09:27:23.965 01演练[] 清除了&
2015 09:27:23.965 01演练[] 设置
2015 09:27:24.466 01演练[] 清除了&
2015 09:27:24.466 01演练[] 设置
2015 09:27:24.967 01演练[] 清除了&
2015 09:27:24.967 01演练[] 缓存中&()
2015 09:27:24.967 01演练[] 缓存中&()
2015 09:27:24.968 01演练[] 缓存中&()
2015 09:27:24.968 01演练[] 缓存中&()
2015 09:27:24.968 01演练[] 缓存中&()
2015 09:27:24.968 01演练[] 缓存中&()
2015 09:27:24.969 01演练[] 缓存中&()
2015 09:27:24.969 01演练[] 缓存中&()
2015 09:27:24.969 01演练[] 缓存中&()
2015 09:27:24.969 01演练[] 缓存中&()
2015 09:27:24.969 01演练[] 缓存中&
2015 09:27:24.970 01演练[] 缓存中&
2015 09:27:24.970 01演练[] 缓存中&
2015 09:27:24.970 01演练[] 缓存中&
2015 09:27:24.970 01演练[] 缓存中&
2015 09:27:24.971 01演练[] 缓存中&
2015 09:27:24.971 01演练[] 缓存中&
2015 09:27:24.971 01演练[] 缓存中&
2015 09:27:24.971 01演练[] 缓存中&
2015 09:27:24.971 01演练[] 缓存中&
通过打印结果可以知道,当超多最大成本限制的时候,会先清除缓存中的一条数据,再存入一条新的数据。最后缓存中只能保存最大成本数的数据,即10条。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94304次
积分:1631
积分:1631
排名:千里之外
原创:61篇
评论:73条
(1)(1)(1)(1)(1)(1)(7)(10)(4)(4)(1)(2)(1)(21)(2)(1)(2)(1)为什么 iOS 会有自动删除 App 数据的设定? - 知乎94被浏览83416分享邀请回答572 条评论分享收藏感谢收起22178 条评论分享收藏感谢收起查看更多回答10 个回答被折叠()}

我要回帖

更多关于 ios11什么时候推送 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信