文档章节

NSCache的一些理解

DXSmile_大熊
 DXSmile_大熊
发布于 2016/02/16 22:41
字数 1291
阅读 35
收藏 0

对于NSCache的一些理解


对于有一定开发经验的iOS攻城狮来说,我们在对一个APP数据做存储和内存优化的时候,不可避免的需要对缓存做相应的处理,而且缓存处理的优劣,往往也是决定一个APP能否长线发展的重要因素之一,今天就来说一下经常容易被我们忽略的一个苹果官方提供的一套缓存机制--->NSCache


什么是NSCache?

1. NSCache苹果提供的一套缓存机制

主要作用于内存缓存的管理方面; 在没有引入NSCache之前,我们要管理缓存,都是使用的NSMutableDictionary来管理,如:

// 定义下载操作缓存池
@property (nonatomic, strong) NSMutableDictionary *operationCache;
// 定义图片缓存池
@property (nonatomic, strong) NSMutableDictionary *imageCache;

然而,使用NSMutableDictionary来管理缓存是有些不妥的, 知道多线程操作原理的开发者都明白, NSMutableDictionary在线程方面来说是不安全,这也是苹果官方文档明确说明了的,而如果使用的是NSCache,那就不会出现这些问题.所以接下来我们先看看二者的区别:

&1 NSCache和NSMutableDictionary的相同点与区别:

相同点: NSCache和NSMutableDictionary功能用法基本是相同的。

区别:

  1. NSCache是线程安全的,NSMutableDictionary线程不安全 NSCache线程是安全的,Mutable开发的类一般都是线程不安全的
  2. 当内存不足时NSCache会自动释放内存(所以从缓存中取数据的时候总要判断是否为空)
  3. NSCache可以指定缓存的限额,当缓存超出限额自动释放内存 缓存限额:
  1. 缓存数量 @property NSUInteger countLimit;
  2. 缓存成本 @property NSUInteger totalCostLimit;
  1. 苹果给NSCache封装了更多的方法和属性,比NSMutableDictionary的功能要强大很多

2.代码演示:

先定义缓存池,并懒加载初始化:

#import "ViewController.h"

@interface ViewController () <NSCacheDelegate>

// 定义缓存池
@property (nonatomic, strong) NSCache *cache;
@end

@implementation ViewController
- (NSCache *)cache {
if (_cache == nil) {
    _cache = [[NSCache alloc] init];
    // 缓存中总共可以存储多少条
    _cache.countLimit = 5;
    // 缓存的数据总量为多少
    _cache.totalCostLimit = 1024 * 5;
}
return _cache;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.

  //添加缓存数据
   for (int i = 0; i < 10; i++) {
    [self.cache setObject:[NSString stringWithFormat:@"hello %d",i] forKey:[NSString stringWithFormat:@"h%d",i]];
    NSLog(@"添加 %@",[NSString stringWithFormat:@"hello %d",i]);
   }

  //输出缓存中的数据
   for (int i = 0; i < 10; i++) {
    NSLog(@"%@",[self.cache objectForKey:[NSString stringWithFormat:@"h%d",i]]);
   }

}

控制台输出结果为: 控制台输出结果

**通过输出结果可以看出: **

1.当我们使用NSCache来创建缓存池的时候,我们可以很灵活的设置缓存的限额, 2.当程序中的个数超过我们的限额的时候,会先移除最先创建的 3.如果已经移除了,那么当我们输出缓存中的数据的时候,就只剩下后面创建的数据了;

3. 演示NSCache的代理方法

先设置代理对象: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //设置NSCache的代理 self.cache.delegate = self; 调用代理方法: 这里我仅用一个方法来演示:

	 //当缓存被移除的时候执行
         - (void)cache:(NSCache *)cache willEvictObject:(id)obj{
	    NSLog(@"缓存移除  %@",obj);
       }

输出结果为: 输出结果

通过结果可以看出: NSCache的功能要比NSMutableDictionary的功能要强大很多很多;

4.当遇到内存警告的时候,

代码演示:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    //当收到内存警告,清除内存
    [self.cache removeAllObjects];
    //输出缓存中的数据
    for (int i = 0; i < 10; i++) {
        NSLog(@"%@",[self.cache objectForKey:[NSString stringWithFormat:@"h%d",i]]);
    }
}

控制台输出结果: 收到内存警告 通过结果可以看出: 当收到内存警告之后,清除数据之后,NSCache缓存池中所有的数据都会为空!

5.当收到内存警告,调用removeAllObjects 之后,无法再次往缓存池中添加数据

代码演示:

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    //当收到内存警告,调用removeAllObjects 之后,无法再次往缓存中添加数据
    [self.cache removeAllObjects];
    //输出缓存中的数据
    for (int i = 0; i < 10; i++) {
        NSLog(@"%@",[self.cache objectForKey:[NSString stringWithFormat:@"h%d",i]]);
    }
}

// 触摸事件, 以便验证添加数据
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self.cache removeAllObjects];
    
    //添加缓存数据
    for (int i = 0; i < 10; i++) {
        [self.cache setObject:[NSString stringWithFormat:@"hello %d",i] forKey:[NSString stringWithFormat:@"h%d",i]];
//        NSLog(@"添加 %@",[NSString stringWithFormat:@"hello %d",i]);
    }
    
    //输出缓存中的数据
    for (int i = 0; i < 10; i++) {
        NSLog(@"%@",[self.cache objectForKey:[NSString stringWithFormat:@"h%d",i]]);
    }

}

控制台输出结果为: 输出结果

通过输出结果,我们可以看出: 当收到内存警告,而我们又调用removeAllObjects 之后,则无法再次往缓存中添加数据;

更多详情可以查看我的Github项目: https://github.com/DXSmile/NSCache-some-understanding..git

© 著作权归作者所有

DXSmile_大熊
粉丝 9
博文 22
码字总数 28308
作品 0
海淀
项目经理
私信 提问
提升用户愉悦感的润滑剂-看SDWebImage本地缓存结构设计

手机应用发展到今天,用户的体验至关重要,有时决定着应用产品的生死,比如滑动一个商品列表时,用户自然地希望列表的滑动跟随手指,如丝般顺滑,如果卡顿,不耐烦的用户就会点退出按钮,商品...

溪石iOS
02/25
0
0
iOS 获取内存信息与NSCache用法说明

一.获取内存使用情况 获取iOS App运行时内存,可以通过如下模块 获取cpu核心数 获取方式如下,获取内存可以用空间 获取当前内存占用情况 获取app运行总内存 二、NSCache使用 1.NSCache的用法...

IamOkay
2018/01/15
150
0
iOS - OC NSCache 缓存

前言 NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本。用法与 NSMutableDictionary 的用法很相似,在 AFNe...

仟0123
2016/08/18
0
0
《Effective Objective-C 2.0》读书笔记

思维导图.png 前言 好长时间没有更新了,年后把《Effective Objective-C 2.0》这本书看完了,上面👆是用思维导图画出来的整本书的内容。下面把书中一些重要的和难理解的知识点整理一下,不...

_誌念
2018/03/25
0
0
NSCache深入浅出

介绍 是苹果提供的一个专门用来做缓存的类 使用和 非常相似 是线程安全的 当内存的时候,会自动清理缓存 程序开始时,可以指定缓存的 & 方法 取值 设置对象,0成本 设置对象并指定 成本示例,...

就不穿小内
2015/12/11
889
0

没有更多内容

加载失败,请刷新页面

加载更多

Intellij IDEA神器那些让人爱不释手的小技巧

概述 在2018年5月6日写了一篇介绍IntellIJ IDEA的文章,Intellij IDEA神器居然还有这些小技巧,主要是列出一些平时大家可能没用过或者没怎么用,但是又非常好用的IntellIJ IDEA小技巧。由于篇幅...

xiaolyuh
7分钟前
1
0
Jquery结合CSS实现选项卡功能

先看效果图: 现在就让我们看看实现的过程,首先看看 html 代码: <div id="category" class="category boxshadow"> <ul class="nav"> <li> <a id="nvajquery" class="current" href="#jque......

前端老手
12分钟前
2
0
PHP学习记录整理

PHP 输出文本的基础指令:echo 和 print。 echo和print的区别 echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用) echo 输出一个或者多个字符串。 print ...

半缘修道半缘君丶
21分钟前
2
0
胡哥一分钟课堂第0001期 - Hybrid App(混合开发APP)

前言 Hybrid APP 即混合开发APP,今天胡哥和大家一起认识Hybrid App。 目前APP的开发方式有三种:原生APP、Web App、Hybrid APP(混合开发APP) 一、原生APP 即IOS(Objective-C等)、Andri...

胡哥有话说
28分钟前
2
0
SpringBoot 集成ElasticSearch

一、ElasticSearch介绍 ElasticSearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源...

zw965
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部