zoukankan      html  css  js  c++  java
  • NSCache类的简单介绍

    最近看SDWebImage,里面的内存缓存用到了NSCache这个类,由于以前没有使用过,特此记录学习一下。

    NSCache

    NSCache是苹果官方提供的缓存类,用法和NSMutableDictonary非常类似.

    NSCache是一个类似于集合的容器,即缓存。它存储key-value,这一点非常类似字典。开发者一般用NSCache来缓存临时存储短时间但是使用成本高的对象。重用这些对象可以优化性能,因为它们的值不在被重新计算。另外一方面,这些对象对于程序来说是不要紧的,在内存紧张的时候会被丢弃,如果对象被丢弃了,则下次使用的时候需要重新计算.

    当一个key-value对象缓存时,缓存维护它的一个强引用。存储在NSCache中的通用类型通常是实现了NSDiscardableContent协议的对象.,

    在缓存中存储这类对象的好处是,当你不需要它的时候可以丢弃这些内容,以节省内存.默认情况下,缓存中的NSDiscardableContent对象在其内容被
    丢弃的时候,会被移除缓存,如果一个NSDiscardableContent被放进缓存,则在对象被移除时,缓存会调用discardContentIfPossible方法。
    NSCache在系统发出低内存通知时,会自动删除缓存
    例如当不断给NSCache填充数据时,应用内存会越来越大,当大小在500M左右时,系统抛出Received memory warning ,此时查看内存,发现内存会减少,因为NSCache在内存警报时,会自动删除缓存。
    NScache可以设置数量限制和大小设置,countLimit设置数量限制的,totalCount是设置大小的,但是通常不用,计算也比较麻烦。
    NSCache是线程安全的 再多线程操作中,不需要对其加锁。而且NSCache的key只是对对象进行强引用,不是拷贝。

    NSCache的用法

    @interface NSCache <KeyType, ObjectType> : NSObject {
    @private
        id _delegate;
        void *_private[5];
        void *_reserved;
    }
    
    @property (copy) NSString *name; //名称
    
    @property (nullable, assign) id<NSCacheDelegate> delegate; //设置代理
    
    - (nullable ObjectType)objectForKey:(KeyType)key;// 取出缓存的键值对。
    - (void)setObject:(ObjectType)obj forKey:(KeyType)key; // 设置缓存的键值对
    - (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g;// 设置缓存的键值对,
    并指定改键值对的成本,用于计算记录在缓存中的总成本,出现内存警告或者内存总成本超出上限的时候,混存会开启一个回收过程,删除部分元素.
    - (void)removeObjectForKey:(KeyType)key; - (void)removeAllObjects; @property NSUInteger totalCostLimit; // 缓存空间的最大总成本,超出上限会自动回收对象,默认为0,表示没有限制. @property NSUInteger countLimit; // 能够缓存的对象的最大数量,默认为0,表示没有限制 @property BOOL evictsObjectsWithDiscardedContent; //标识缓存是否回收废弃的内容 @end @protocol NSCacheDelegate <NSObject> @optional - (void)cache:(NSCache *)cache willEvictObject:(id)obj;//即将要回收对象的时候 调用该方法。 @end
    - (NSCache *)cache {
        if (_cache == nil) {
            _cache = [[NSCache alloc] init];
        }
        return _cache;
    }
    //存储数据
    - (IBAction)addCache:(id)sender {
        for (NSInteger i = 0; i < 10; i ++) {
            NSString *str = [NSString stringWithFormat:@"tian%ld",(long)i];
            [self.cache setObject:str forKey:@(i)];
        }
    }
    
    - (IBAction)checkCache:(id)sender {
        for (NSInteger i = 0; i < 10; i ++) {
            NSString *str = [self.cache objectForKey:@(i)];
            if (str) {
                NSLog(@"取出的数据:  %@",str);
            }
        }
    }
    
    - (IBAction)deleteCache:(id)sender {
        NSString *str = [self.cache objectForKey:@(1)];
        if (str) {
            [self.cache removeObjectForKey:@(1)];
        }
    }
    _cache.totalCostLimit = 5;//总成本是5,如果缓存的总成本超过5 就回收之前的缓存对象
            //配合- (void)setObject:(ObjectType)obj forKey:(KeyType)key cost:(NSUInteger)g 使用g就是缓存一个对象的成本

    NSCache与可变集合的不同:

    1.NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存。如果其它应用需要内存时,系统自动执行这些策略。当调用这些策略时,会从缓存中删除一些对象,以最大限度减少内存的占用
    2.NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存中的对象,而不需要锁定缓存区域。
    3.不像NSMutableDictionary对象,一个缓存对象不会拷贝key对象


     
     
  • 相关阅读:
    重磅官宣:Nacos2.0发布,性能提升10倍
    埃森哲携手阿里云共建基于云原生的消费者运营中台解决方案
    3. Windows根据端口查进程---ADB 相关报错 ADB server didn't ACK cannot bind ':5037'
    2.Could not open Selected VM debug port (8700). Make sure you do not have another instance of DDMS or of the eclipse plugin running
    1.运行Android Studio,一直提示:Error running app: Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
    SpringBoot_配置-yaml配置文件值获取
    SpringBoot_入门-使用向导快速创建Spring Boot应用
    SpringBoot_入门-HelloWorld细节-自动配置
    SpringBoot_入门-微服务简介
    SpringBoot_入门-Spring Boot简介
  • 原文地址:https://www.cnblogs.com/huanying2000/p/8663135.html
Copyright © 2011-2022 走看看