美文网首页
NSCache、NSDictionary、NSMapTable

NSCache、NSDictionary、NSMapTable

作者: YFBigHeart | 来源:发表于2023-03-16 15:06 被阅读0次

    NSCache: 专门做缓存的类

    官方描述

    A mutable collection you use to temporarily store transient key-value pairs that are subject to eviction when resources are low.
    一个可变的集合,用于临时存储在资源不足时易被驱逐的临时键值对。

    NSCache属性和方法介绍

    #import <Foundation/NSObject.h>
    
    @class NSString;
    @protocol NSCacheDelegate;
    
    NS_HEADER_AUDIT_BEGIN(nullability, sendability)
    
    API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0))
    @interface NSCache <KeyType, ObjectType> : NSObject
    
    @property (copy) NSString *name;// 名称
    
    @property (nullable, assign) id<NSCacheDelegate> delegate;// 设置代理
    
    - (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;
    //删除缓存中指定键名的对象
    - (void)removeObjectForKey:(KeyType)key;
    //删除缓存中所有的对象
    - (void)removeAllObjects;
    
    @property NSUInteger totalCostLimit;    // 缓存空间的最大总成本,超出上限会自动回收对象。默认值为0,表示没有限制
    @property NSUInteger countLimit;    // 能够缓存的对象的最大数量。默认值为0,表示没有限制
    @property BOOL evictsObjectsWithDiscardedContent;
    
    @end
    //该代理只有一个回调方法,移除存储内容的时候会执行代理方法。
    @protocol NSCacheDelegate <NSObject>
    @optional
    /* Called when an object is about to be evicted or removed from the cache.
    当要从缓存中清除或删除对象时调用。*/
    - (void)cache:(NSCache *)cache willEvictObject:(id)obj;
    @end
    

    NSCache 特点:1.会自动释放对象 2.只Strong 不Copy 3.线程安全

    1)NSCache是苹果官方提供的缓存类,具体使用和NSMutableDictionary类似,在AFN和SDWebImage框架中被使用来管理缓存
    2)苹果官方解释NSCache在系统内存很低时,会自动释放对象.
        建议:接收到内存警告时主动调用removeAllObject方法释放对象
    3)NSCache的Key只是对对象进行Strong引用,不是拷贝,在清理的时候计算的是实际大小而不是引用的大小
    
    4)NSCache是线程安全的,在多线程操作中,不需要对NSCache加锁.NSDictionary不是。在开发者自己不编写加锁代码的前提下,多个线程可以同时访问NSCache。对缓存来说,线程安全通常是很重要的,因为开发者可能在某个线程中读取数据,此时如果发现缓存里找不着指定的键,那么就要下载该键对应的数据了
    

    NSDictionary 字典集合对象

    1)NSDictionary 键(key)是被拷贝的并且需要是恒定的,通常我们用字符串类型对象作为键比较多,其他的对象也可以作为键,但是对象要遵守<NSCopying> 协议实现相应的copy方法即可。
    2)NSDictionary 对值(value)的是通过强引用来存储值对象的
    3)NSDictionary 不是线程安全的,多线程访问需要程序员自己编写保证线程安全的代码
    4)NSDictionary 所占内存不会像NSCache那样被系统自动清除,而是需要程序员自己处理内存使用问题
    
    

    这里顺便提一嘴:setObject:ForKey:与setValue:ForKey:的区别与联系

    1.setObject:ForKey:是NSMutableDictionary特有的;
    setValue:ForKey:是KVC的主要方法;
    
    2.setObject:ForKey:中object不能为nil,不然会报错 ;key的参数只要是对象就可以,不局限于NSString ;
    
    setValue:ForKey:中Value可以为nil,此时会自动调用removeObject:forKey:方法;key的参数只能是NSString类型 ;
    
    3.nil与null不同,[NSNull null]表示是的一个空的对象,并不是nil;
    
    4.setValue:ForKey:是在NSObject对象中创建的,即所有的对象都有这个方法,可以用于任何类;(方法调用者是对象的时候)
    

    好到这这里提个问题: 下面打印的值分别是多少?

    NSDictionary *dict =@{@"name":@"liuyunfei",@"@age":@"18",@"age":@"19"};
    NSLog(@"age1:%@",[dict valueForKey:@"@age"]);
    NSLog(@"age2:%@",[dict valueForKey:@"age"]);
    NSLog(@"age3:%@",[dict objectForKey:@"@age"]);
    NSLog(@"age4:%@",[dict objectForKey:@"age"]);
    

    NSMapTable:相对NSDictionary来说对key和value具有更广泛的语义说明,可以指定key或value是拷贝、强引用或弱引用。

    @interface NSMapTable<KeyType, ObjectType> : NSObject <NSCopying, NSSecureCoding, NSFastEnumeration>
    
    // 初始化方法,可以对 key 和 value 设置引用策略, initialCapacity:这个是初始化容积数量
    - (instancetype)initWithKeyOptions:(NSPointerFunctionsOptions)keyOptions valueOptions:(NSPointerFunctionsOptions)valueOptions capacity:(NSUInteger)initialCapacity NS_DESIGNATED_INITIALIZER;
    - (instancetype)initWithKeyPointerFunctions:(NSPointerFunctions *)keyFunctions valuePointerFunctions:(NSPointerFunctions *)valueFunctions capacity:(NSUInteger)initialCapacity NS_DESIGNATED_INITIALIZER;
    
    + (NSMapTable<KeyType, ObjectType> *)mapTableWithKeyOptions:(NSPointerFunctionsOptions)keyOptions valueOptions:(NSPointerFunctionsOptions)valueOptions;
    
    + (NSMapTable<KeyType, ObjectType> *)strongToStrongObjectsMapTable API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));
    + (NSMapTable<KeyType, ObjectType> *)weakToStrongObjectsMapTable API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0)); // entries are not necessarily purged right away when the weak key is reclaimed
    + (NSMapTable<KeyType, ObjectType> *)strongToWeakObjectsMapTable API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));
    + (NSMapTable<KeyType, ObjectType> *)weakToWeakObjectsMapTable API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0)); // entries are not necessarily purged right away when the weak key or object is reclaimed
    
    /* return an NSPointerFunctions object reflecting the functions in use.  This is a new autoreleased object that can be subsequently modified and/or used directly in the creation of other pointer "collections". */
    @property (readonly, copy) NSPointerFunctions *keyPointerFunctions;
    @property (readonly, copy) NSPointerFunctions *valuePointerFunctions;
    
    - (nullable ObjectType)objectForKey:(nullable KeyType)aKey;
    
    - (void)removeObjectForKey:(nullable KeyType)aKey;
    - (void)setObject:(nullable ObjectType)anObject forKey:(nullable KeyType)aKey;   // add/replace value (CFDictionarySetValue, NSMapInsert)
    
    @property (readonly) NSUInteger count;
    
    - (NSEnumerator<KeyType> *)keyEnumerator;
    - (nullable NSEnumerator<ObjectType> *)objectEnumerator;
    
    - (void)removeAllObjects;
    
    - (NSDictionary<KeyType, ObjectType> *)dictionaryRepresentation;  // create a dictionary of contents
    @end
    
    

    相关文章

      网友评论

          本文标题:NSCache、NSDictionary、NSMapTable

          本文链接:https://www.haomeiwen.com/subject/hecdrdtx.html