iOS学习笔记-130.NSCache使用

来源:互联网 发布:时尚淘宝店 编辑:程序博客网 时间:2024/06/05 19:00

  • NSCache使用
    • 一简介
    • 1 totalCostLimit 总成本说明
    • 2 countLimit 总个数说明
    • 二方法说明
    • 三代码示例
    • 四图示
    • 五运行结果分析

NSCache使用

一、简介

NSCache的使用和我们的字典是一样的,唯一不同的就是,它有成本和个数可以做限制。除此之外,NSCache 是线程安全的。

1.1 totalCostLimit 总成本说明

NSCache 的 totalCostLimit 属性可以用来限制,缓存的大小,它和 - (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g; 方法配合使用。

==但是重点是,如果我添加是同一个对象,那么只算一个对象的成本。==

比如,我们希望用我们的缓存来存储图片,我们限制图片缓存的总成本为 10M。

那么我们我们可以这么设置

_cache.totalCostLimit = 10;//假设我们的单位为 M

当我们添加图片到缓存中的时候,可以如下添加

[_cache setObject:image forKey:key cost:5];//假设我们的图片大小5M

那么我们添加第一、二个图片的时候,就会存入到图片缓存中。(假设图片大小都是5M)

现在我们来添加第三张图片,发现我们的缓存已经到了最大值,我们无法添加,

那么NSCache,就会把第一张图片从缓存中删除,然后来检查是空间是否已经足够

添加第三张图片了,如果不够,那么继续删除第二张,如果够了,那么把第三张

图片添加到缓存中。

1.2 countLimit 总个数说明

countLimit,是用来限制个数的。比如我们的缓存中限制了存入的个数是 5 个,现在我们来添加第6个,那么它会把第1个删除以后再添加。

==但是重点是,如果我添加是同一个对象,那么只算一个个数。==


二、方法说明

//通过key来获取对象- (nullable ObjectType)objectForKey:(KeyType)key;//存储对象对象,花费的成本默认为0- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 0 cost//存储对象对象,花费的成本需要传入- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;//通过key来移除对象- (void)removeObjectForKey:(KeyType)key;//移除所有对象- (void)removeAllObjects;@protocol NSCacheDelegate <NSObject>@optional//即将回收对象的时候调用该方法- (void)cache:(NSCache *)cache willEvictObject:(id)obj;@end

三、代码示例

////  ViewController.m//  03_UIview88_NSCache////  Created by 杞文明 on 17/9/9.//  Copyright © 2017年 杞文明. All rights reserved.//#import "ViewController.h"@interface ViewController ()<NSCacheDelegate>/*缓存*/@property(nonatomic,strong)NSCache *cache;/*删除数据的时候使用一下*/@property(nonatomic,assign)NSInteger index;@end@implementation ViewController-(NSCache *)cache{    if(_cache==nil){        //创建一个缓存        //NSCache的Key只是对对象进行Strong引用,不是拷贝(和可变字典的区别)        _cache = [[NSCache alloc]init];        //总成本数是100 ,如果发现存的数据超过中成本那么会自动回收之前的对象        //如果我们做的是图片的缓存,那么我们这里可以设为图片缓存的最大值        //如果添加的对象是同一个对象,那么只算一个对象的成本。        _cache.totalCostLimit = 20;        //设置我们的缓存中,能添加的个数据,如果添加的对象是同一个,那么只算一个个数//        _cache.countLimit = 2;        _cache.delegate = self;    }    return _cache;}/*存入不同的数据*/- (IBAction)addDifference:(id)sender {    NSLog(@"---存入不同的数据----");    for (int i=0; i<5; i++) {        NSObject * obj = [NSObject new];//        [self.cache setObject:obj forKey:@(i)];        //添加到缓存中        [self.cache setObject:obj forKey:@(i) cost:10];        NSLog(@"存入数据  %zd--%@",i,obj);    }}/*存入相同的数据*/- (IBAction)addSame:(id)sender {    NSLog(@"---存入相同的数据----");    NSObject * obj = [NSObject new];    for (int i=0; i<5; i++) {//        [self.cache setObject:obj forKey:@(i)];        [self.cache setObject:obj forKey:@(i) cost:10];        NSLog(@"存入数据  %zd--%@",i,obj);    }}/*取数据*/- (IBAction)getData:(id)sender {    NSLog(@"---取数据----");    for (int i=0; i<5; i++) {        NSObject *obj = [self.cache objectForKey:@(i)];        if (obj!=nil) {             NSLog(@"取到数据  %zd--%@",i,obj);        }    }}/*删除一个数据*/- (IBAction)removeOne:(id)sender {    NSLog(@"---删除一个数据----");    [self.cache removeObjectForKey:@(self.index)];    self.index = (self.index+1)%5;}/*删除全部数据*/- (IBAction)removeAll:(id)sender {    NSLog(@"---删除全部数据----");    [self.cache removeAllObjects];}/*即将回收对象的时候调用该方法*/-(void)cache:(NSCache *)cache willEvictObject:(id)obj{    NSLog(@"--回收--%@",obj);}@end

四、图示

image


五、运行结果分析

[37759:166850] ---存入相同的数据----[37759:166850] 存入数据  0--<NSObject: 0x600000206180>[37759:166850] 存入数据  1--<NSObject: 0x600000206180>[37759:166850] 存入数据  2--<NSObject: 0x600000206180>[37759:166850] 存入数据  3--<NSObject: 0x600000206180>[37759:166850] 存入数据  4--<NSObject: 0x600000206180>[37759:166850] ---删除全部数据----[37759:166850] --回收--<NSObject: 0x600000206180>[37759:166850] ---存入不同的数据----[37759:166850] 存入数据  0--<NSObject: 0x60000001bc50>[37759:166850] 存入数据  1--<NSObject: 0x60800001c280>[37759:166850] --回收--<NSObject: 0x60000001bc50>[37759:166850] 存入数据  2--<NSObject: 0x600000205b10>[37759:166850] --回收--<NSObject: 0x60800001c280>[37759:166850] 存入数据  3--<NSObject: 0x60800001c000>[37759:166850] --回收--<NSObject: 0x600000205b10>[37759:166850] 存入数据  4--<NSObject: 0x60000001bc50>

存入同一个对象的时候,它只算了一个成本,所有我们而已存入5个数据。

存入不同的对象的时候,我们发现,一开始存入 数据0和数据1 的时候没什么问题

存入 数据2 的时候,它回收了数据0。存数 数据3 回收了数据1 。

原创粉丝点击