iOS之《Effective Objective-C 2.0》读书笔记(50)

来源:互联网 发布:qq电脑加速软件 编辑:程序博客网 时间:2024/06/07 07:25

第50条:构建缓存时选用NSCache而非NSDictionary

1.初步了解NSCache

  • NSCache的定义:是一个类似于集合的容器,即缓存。它存储key-value对,这一点类似于NSDictionary类

  • NSCache的优点:
    (1)当系统资源耗尽时,它可以自动删减缓存
    (2)NSCache是线程安全的,多个线程可以同时访问NSCache
    (3) 可以控制缓存删减的实际,有两个参数可以调整,一个是缓存中的对象总数,第二个是所有对象的总开销(这个机制只对NSCache起到指导作用,不会一定执行)
    (4)与字典不同,不会拷贝键,只会保留键

  • 联系实际:我们常用的SDWebImage图片下载库的缓存机制就是通过NSCache来实现的

2.学习使用NSCache

  • NSCache的属性:
countLimit:限定了缓存最多维护的对象的个数totalCostLimit:来限定缓存能维持的最大内存evictsObjectsWithDiscardedContent:来标识缓存是否自动舍弃那些内存已经被丢弃的对象,默认值为YESdelegate:代理属性,实现NSCacheDelegate代理的对象会在对象即将从缓存中移除时执行一些特定的操作
  • NSCache的方法:
-(id)objectForKey:(id)key-(void)setObject:(id)obj forKey:(id)key-(void)removeObjectForKey:(id)key-(void)removeAllObjects-(void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)num //我们在存储对象时,可以为对象指定一个消耗值
  • NSCache的使用方式:
@implementation fiftyDemo {      NSCache *_cache;  }  -(id)init {      self = [super init];      if (self) {          _cache = [NSCache new];          _cache.countLimit = 100;    //  最大对象数100          _cache.totalCostLimit = 55 * 11024 * 1024;    //  总开销5MB      };      return self;  }  -(void)downloadDataForURL:(NSURL *)url {      NSData *cachedData = [_cache objectForKey:url];      if (cachedData) {          //[self useData:cachedData];      } else {          EOCNetworkFetcher *fetcher = [[EOCNetworkFetcher alloc] initWithURL:url];          [fetcher startWithCompletionHandler:^(NSData *data) {              [_cache setObject:data forKey:url cost:data.length];              //[self useData];          }];      }  }  @end  

3.NSPurgeableData与之搭配

  • NSPurgeableData是NSMutableData子类

  • 需实现NSDiscardableContent协议:实现这个协议的目的是为了让我们的对象在不被使用时,可以将其丢弃,以让程序占用更少的内存

-(void)discardContentIfPossible这样当counter变量等于0时将会释放相关的内存。而如果counter变量不为0,则该方法什么也不做。-(BOOL)beginContentAccess通常我们在对象被需要或者将要使用时调用这个方法。-(void)endContentAccess该方法会减少对象的counter变量,通常是让对象的counter值变回为0,这样在对象的内容不再被需要时,就要以将其丢弃
  • NSPurgeableData的具体使用:
-(void)downloadDataForURLTwo:(NSURL *)url {      NSPurgeableData *cachedData = [_cache objectForKey:url];      if (cachedData) {          [cachedData beginContentAccess];          // [self useData:cacheData];          [cachedData endContentAccess];      } else {          EOCNetworkFetcher *fetcher = [[EOCNetworkFetcher alloc] initWithURL:url];          [fetcher startWithCompletionHandler:^(NSData *data) {              NSPurgeableData *purgeableData = [NSPurgeableData dataWithData:data];              [_cache setObject:purgeableData forKey:url cost:purgeableData.length];              //[self useData:purgeableData];              [purgeableData endContentAccess];          }];      }  }  
阅读全文
0 0
原创粉丝点击