iOS - NSCache

1,526 阅读1分钟

NSCache是一个类似于集合的容器,即缓存。它存储key-value对,这一点类似于NSDictionary类。
利用他可以解决一些内存紧张导致的问题。
AFN,SDWebImage都是用NSCache来解决缓存问题

NSCache 不Copy Key

NSDictionary

NSCache的key 没有遵循协议

- (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;

NSCache

- (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 0 cost

NSCache 线程安全

  • NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。

NSCache 自动删除

  • 默认500MB内存限制
  • countLimit:数量限制
  • totalCostLimit:cost限制(cost对象占用的字节数)

countLimit,totalCostLimit是不精确的

  • evictsObjectsWithDiscardedContent 缓存是否自动废弃内容已经被废弃的对象

evictsObjectsWithDiscardedContent 和 来控制对象是否会被自动移除的机制,但是这可能只会让你碰到更多的问题。

NSCacheDelegate

@optional
- (void)cache:(NSCache *)cache willEvictObject:(id)obj;

例子

Example:

    NSCache *cache = [[NSCache alloc] init];
    cache.delegate = self;
    cache.countLimit = 10;
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"1" withExtension:@"pdf"];
    for (int i = 0; i < 10000000; i++) {
        NSData *data = [NSData dataWithContentsOfURL:url];
        [cache setObject:data forKey:[NSString stringWithFormat:@"%d",i]];
    }

你会发现内存占用一只在200MB维持,无论我们存储了多少对象。

打个广告嘿嘿
最近写了个开源图表框架
github.com/JunyiXie/XJ…
觉得不错的话可以给我个star
当然也欢迎issue!
代码贡献!