前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >系统框架--50:构建缓存时选用NSCache

系统框架--50:构建缓存时选用NSCache

作者头像
xy_ss
发布2023-11-22 08:33:16
2190
发布2023-11-22 08:33:16
举报
文章被收录于专栏:浮躁的喧嚣

NSCache

NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中,使用它来管理缓存

  • 当系统资源将要耗尽时,它可以自动删除缓存(NSCache会先行删减“最久未使用的”对象,)
  • NSCache并不会拷贝key,而是会保留它,因为大多数key值都是由不支持拷贝的对象来充当的
  • NScache是线程安全的,在多线程操作中,不需要对Cache加锁

NSCache的属性

  • countLimit:能够缓存对象的最大数量,默认值是0(没有限制)
  • totalCostLimit :缓存空间的最大成本,超出上限会自动回收对象。默认值是0(没有限制)
  • 当超出缓存最大成本或数量时,NSCache会把前面的数据即最开始存的给清除掉
  • evictsObjectsWithDiscardedContent:表示是否回收废弃的内容,默认值是YES(自动回收)

NSCache的方法

  • objectForKey:返回与键值关联的对象
  • setObject: forKey: 在缓存中设置指定键名对应的值。与可变字典不同的是,缓存对象不会对键名做copy操作
  • setObject: forKey: cost: 在缓存中设置指定键名对应的值,并且指定该键值对的成本。成本cost用于计算记录在缓冲中所有对象的总成本。当出现内存警告,或者超出缓存的成本上限时,缓存会开启一个回收过程,删除部分元素
  • removeObjectForKey:删除缓存中指定键名的对象
  • removeAllObjects:删除缓存中的所有对象

委托方法

  • cache: willEvictObject: 缓存将要删除对象时调用,不能在此方法中修改缓存。仅仅用于后台的打印,以便于调试
代码语言:javascript
复制
#import "ViewController.h"

@interface ViewController()<NSCacheDelegate>
@property (nonatomic, strong) NSCache *myCache;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    for (int i =0 ; i< 5; i++) {
        // 向缓存中添加对象
        NSString *str = [NSString stringWithFormat:@"cache - %d", I];
        [self.myCache setObject:str forKey:@(i)];
    }
    for (int i=0 ; i< 5; i++) {
        NSLog(@"%@", [self.myCache objectForKey:@(i)]);
    }
}

-(NSCache *)myCache
{
    if (_myCache == nil) {
        _myCache = [[NSCache alloc] init];
        _myCache.countLimit = 3;
        _myCache.delegate = self;
    }
    return _myCache;
}

#pragma mark- delegate
-(void)cache:(NSCache *)cache willEvictObject:(id)obj
{
    NSLog(@"要删除的对象obj-------------%@", obj);
}
@end

cache.png

NSPurgeableData

  • NSMutableData的子类,且实现了NSDiscardableContent协议
  • 当系统资源紧张时,可以把保存NSPurgeableData对象的那块内存释放掉
  • 调用beginContentAccess,说明现在还不应丢弃NSPurgeableData所占的内存
  • 调用endContentAccess,说明在必要时可以丢弃NSPurgeableData所占的内存
  • beginContentAccess与endContentAccess类似引用计数的方式,当对象的“引用计数”为0才可以被丢弃
  • 如果缓存使用得当,那么应用程序的响应速度就能提高,只有那种“只要计算起来很难费事的”数据,才值得放入缓存,比如那些需要从网络获取或从磁盘读取的数据。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NSCache
  • NSCache的属性
  • NSCache的方法
  • 委托方法
  • NSPurgeableData
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档