NSCache

1)NSCache是专门用来进行缓存处理的

    1  NSCache时苹果官方提供的缓存类,具体使用和NSDictionary类似,在AFNetworking框架和SDWebImage框架中被用来管理缓存

    2  苹果官方解释NSCache在系统内存很低时,会自动释放对象(但模拟器演示不会释放)

       建议:接收到内存警告时主动调用removeAllObject方法释放对象

    3  NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁

    4  NSCache的Key只是对对象进行Strong引用,不是拷贝

2)属性:name(名称)

                 delegate(设置代理)

                 totalCostLimit(缓存空间的最大总成本,超出上限会自动回收对象,默认值为0,表示没有限制)

                 countLimit(能够缓存的对象的最大数量,默认值为0,表示没有限制)

                 evictsObjectsWithDiscardContent(标识缓存是否回收废弃的内容)

#import "ViewController.h"
@interface ViewController () <NSCacheDelegate>
@property (nonatomic, strong) NSCache *cache;
@end
@implementation ViewController
- (NSCache *)cache {
    if(_cache == nil) {
        _cache = [[NSCache alloc] init];
        //总成本数,如果存入数据超过总成本,会自动回收之前的对象
        _cache.totalCostLimit = 5;
        _cache.delegate = self;
    }
    return _cache;
}
//存入数据
- (IBAction)addBtnClick:(id)sender {
    //NSData *data = [NSData dataWithContentsOfFile:@"FileName"];
    //NSCache的Key只是对对象进行Strong引用,不是拷贝
    //如果写在这里,存入的对象是同一个,总成本为1,NSCache不会回收对象
    for(NSInteger i = 0; i < 10; i++) {
        NSData *data = [NSData dataWithContentsOfFile:@“FileName];
        //cost:成本
        [self.cache setObject:data forKey:@(i) cost:1];
        NSLog(@"存入数据%zd", i);
    }
}
//取出数据
- (IBAction)checkBtnClick:(id)sender {
    for(NSInteger i = 0; i < 10; i++) {
        NSData *data = [self.cache objectForKey:@(i)];
        if(data) {
            NSLog(@"取出数据%zd", i);
        }
    }
}
//删除数据
- (IBAction)removeBtnClick:(id)sender {
    [self.cache removeAllObjects];
}
//代理方法,即将回收对象时调用该方法
- (void)cache:(NSCache *)cache willEvictObject:(id)obj {
    NSLog(@"回收%zd", [obj length]);
}
@end

猜你喜欢

转载自blog.csdn.net/baidu_28787811/article/details/80305991