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
网友评论