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
- iOS之《Effective Objective-C 2.0》读书笔记(50)
- <iOS读书笔记>之Effective Objective-C 2.0
- iOS之《Effective Objective-C 2.0》读书笔记(1)
- iOS之《Effective Objective-C 2.0》读书笔记(2)
- iOS之《Effective Objective-C 2.0》读书笔记(3)
- iOS之《Effective Objective-C 2.0》读书笔记(4)
- iOS之《Effective Objective-C 2.0》读书笔记(5)
- iOS之《Effective Objective-C 2.0》读书笔记(6)
- iOS之《Effective Objective-C 2.0》读书笔记(7)
- iOS之《Effective Objective-C 2.0》读书笔记(8)
- iOS之《Effective Objective-C 2.0》读书笔记(9)
- iOS之《Effective Objective-C 2.0》读书笔记(10)
- iOS之《Effective Objective-C 2.0》读书笔记(11)
- iOS之《Effective Objective-C 2.0》读书笔记(12)
- iOS之《Effective Objective-C 2.0》读书笔记(13)
- iOS之《Effective Objective-C 2.0》读书笔记(14)
- iOS之《Effective Objective-C 2.0》读书笔记(16)
- iOS之《Effective Objective-C 2.0》读书笔记(17)
- 安卓双向滑动的实现方法
- Sublime Text3 配置TypeScript,使其高亮,提示
- 数据库表查询的内连接、外连接、交叉连接实现方式
- read: unexpected EOF
- 行为型模式总结篇(1)
- iOS之《Effective Objective-C 2.0》读书笔记(50)
- JOSN语法以及和XML的比较
- 第四周项目三(1)—链表的逆置
- 浪曦_Struts2应用开发系列_第2讲.Struts2的类型转换--出现的问题笔记
- 设计模式阅读备忘笔记-策略模式
- Spring事物管理
- 简单谈一谈php中var关键字的作用和意义
- 综合:PullToRefresh+XlistView+TabLayout+DrawerLayout+ViewPager+Fragment+ImageLoader+延时跳转+Shared
- mongoDB-- 基本的操作增删改查