iOS——NSCache

什么是NSCache

NSCache是Foundation框架中的一个类,用于在iOS和macOS应用程序中进行临时性的内存缓存。它提供了一种轻量级的缓存机制,可以用于存储临时性的数据,例如图片、对象等。NSCache的主要特点和用法包括:

  1. 临时性缓存:NSCache用于存储需要临时性缓存的数据,这些数据在应用的生命周期内需要频繁访问,但并不需要永久保存。

  2. 自动管理内存:NSCache会自动管理缓存中的对象,当系统内存不足时,NSCache会自动释放部分缓存对象以腾出内存空间。

  3. 键值对存储:NSCache使用键值对的方式来存储和访问缓存数据。通过键(Key)可以快速查找对应的值(Value)。

  4. 线程安全:NSCache是线程安全的,多个线程可以同时读取和写入缓存,不需要额外的同步措施。

数据持久化的目的

  1. 快速展示,提升体验
    • 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户
  2. 节省用户流量(节省服务器资源)
    • 对于较大的资源数据进行缓存,下次展示无需下载消耗流量
    • 同时降低了服务器的访问次数,节约服务器资源。
  3. 离线使用。
    • 用户浏览过的数据无需联网,可以再次查看。
    • 部分功能使用解除对网络的依赖。(百度离线地图、图书阅读器)
    • 无网络时,允许用户进行操作,等到下次联网时同步到服务端。
  4. 记录用户操作
    • 草稿:对于用户需要花费较大成本进行的操作,对用户的每个步骤进行缓存,用户中断操作后,下次用户操作时直接继续上次的操作。
    • 已读内容标记缓存,帮助用户识别哪些已读。
    • 搜索记录缓存

数据持久化方式分类

在移动端的数据持久化方式总体可以分为以下两类:

  1. 内存缓存
    对于使用频率比较高的数据,从网络或者磁盘加载数据到内存以后,使用后并不马上销毁,下次使用时直接从内存加载。

案例:

  • iOS系统图片加载——[UIImage imageNamed:@“imageName”]
  • 网络图片加载三方库:SDWebImage
  1. 磁盘缓存
    将从网络加载的、用户操作产生的数据写入到磁盘,用户下次查看、继续操作时,直接从磁盘加载使用。

案例:

  • 用户输入内容草稿缓存(如:评论、文本编辑)
  • 网络图片加载三方库:SDWebImage
  • 搜索历史缓存

NSCache缓存类的详解

NSCache在系统内存很低时,会自动释放一些对象。为了确保接收到内存警告时能够真正释放内存,最好调用一下removeAllObjects方法。

NScache的key只是做强引用,不需要实现NScopying协议。

NSCache的属性:

delegate代理属性

  • totalCostLimit :缓存空间的最大成本,超出上限会自动回收对象。默认值是0没有限制。
  • countLimit:能够缓存对象的最大数量,默认值也是0(默认没有限制)。
    (当超出缓存最大成本或数量时,NSCache会把前面的数据即最开始存的给清除掉)
  • evictsObjectsWithDiscardedContent:标示是否回收废弃的内容,默认值是YES(自动回收)。

“成本” 指的是每个对象的缓存大小,通常以字节为单位。如果缓存中的对象总成本超过了这个限制,NSCache 会自动回收一些对象,直到总成本符合限制。默认值为 0,表示没有限制。

NSCache的方法:

-objectForKey:返回与键值关联的对象。通过指定键名调用该方法,可以获取到缓存中对应的对象。如果该键名没有对应的对象,则返回 nil。

-setObject: forKey: 在缓存中设置指定键名对应的值。通过指定键名和对象调用该方法,可以将对象存储到缓存中。与可变字典不同的是,缓存对象不会对键名进行复制操作,因此设置键值对的成本是 0 成本,不会消耗额外的内存。

在可变字典中,通常当你向字典中添加一个新的键值对时,字典会对键名进行复制操作,以确保字典中的键是唯一的。这种复制操作虽然可以保证字典中键名的唯一性,但也会在一定程度上消耗额外的内存。而在 NSCache 中,当你使用 -setObject:forKey: 方法设置键值对时,并不会对键名进行复制操作。这种设计使得在设置键值对时不会消耗额外的内存,这就是“0成本”的意思。

-setObject: forKey: cost: 在缓存中设置指定键名对应的值,并且指定该键值对的成本。成本cost用于计算记录在缓冲中所有对象的总成本。当出现内存警告,或者超出缓存的成本上限时,缓存会开启一个回收过程,删除部分元素。

-removeObjectForKey:删除缓存中指定键名的对象。通过指定键名调用该方法,可以从缓存中移除对应的对象。

-removeAllObjects:删除缓存中的所有对象。调用该方法会清空缓存中的所有对象,使缓存变为空缓存。

委托方法:
-cache: willEvictObject: 缓存将要删除对象时调用,不能在此方法中修改缓存。仅仅用于后台的打印,以便于程序员的测试。

示例:

#import "ViewController.h"@interface ViewController ()<NSCacheDelegate>@property (nonatomic, strong) NSCache *myCaChe;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];//设置缓存容器 self.myCaChe = [[NSCache alloc] init];self.myCaChe.countLimit = 10;self.myCaChe.totalCostLimit = 0;self.myCaChe.delegate = self;UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];btn.frame = CGRectMake(100, 300, 200, 80);[btn setTitle:@"按钮" forState:UIControlStateNormal];[self.view addSubview:btn];[btn addTarget:self action:@selector(touchPress) forControlEvents:UIControlEventTouchUpInside];
}static int a = 0;
- (void) touchPress{//将数据加入缓存 [self.myCaChe setObject:[NSString stringWithFormat:@"value - %d", a] forKey:@(a) cost:1000];NSLog(@"%@", [self.myCaChe objectForKey:@(a)]);a++;
}- (void)cache:(NSCache *)cache willEvictObject:(id)obj {//打印出被从缓存中删除的数据 NSLog(@"delete - %@", obj);
}@end

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/651388.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌搜索量在哪里查询?

如果您想查询的是谷歌搜索的流量数据&#xff0c;比如某个关键词的搜索频率或趋势&#xff0c;Google Trends 是一个很好的工具&#xff0c;它可以让您看到不同时间段内关键词的搜索流行度&#xff0c;也可以比较几个关键词的搜索量&#xff0c;您可以直接访问 Google Trends 网…

Oracle delete删除数据是否为逻辑删除、新插入数据占用的数据块位置实验

假设一&#xff1a;数据库delete删除为直接删除 假设二&#xff1a;数据库delete删除为逻辑删除&#xff0c;在数据块标记出来&#xff0c;但是实际并没有删除。 方式一&#xff1a;通过dump数据块的方式来实现 我们先用小数据量&#xff0c;通过dump数据块的方式来实现 -- 数…

单链表专题实验

答案&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int SLTDataType; typedef struct SListNode {SLTDataType data;struct SListNode* next; }SLTNode; void PrintSLT(SLTNode* phead…

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测

多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测 目录 多输入多输出 | Matlab实现WOA-LSSVM鲸鱼算法优化最小二乘支持向量机多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现WOA-LSSVM鲸鱼算法优化…

【QT】ROS2 Humble联合使用QT教程

【QT】ROS2 Humble联合使用QT教程 文章目录 【QT】ROS2 Humble联合使用QT教程1. 安装ROSProjectManager插件2. 创建ROS项目3.一个快速体验的demoReference 环境的具体信息如下&#xff1a; ubunt 22.04ros2 humbleQt Creator 13.0.0ROS ProjectManager 13.0.0 本文建立在已经…

20.Nacos集群搭建

模拟Nacos三个节点&#xff0c;同一个ip,启动三个不同的端口&#xff1a; 节点 nacos1, 端口&#xff1a;8845 节点 nacos2, 端口&#xff1a;8846 节点 nacos3, 端口&#xff1a;8847 1.搭建数据库&#xff0c;初始化数据库表结构 这里我们以单点的数据库为例 首先新建一…

计算机网络—— book

文章目录 一、概述1.1互联网的核心部分1&#xff0e;电路交换的主要特点2&#xff0e;分组交换的主要特点 1.2.计算机网络的性能1&#xff0e;速率2&#xff0e;带宽3&#xff0e;吞吐量4&#xff0e;时延5&#xff0e;利用率 1.3.计算机网络体系结构协议与划分层次具有五层协议…

OpenHarmony语言基础类库【@ohos.util.LinkedList (线性容器LinkedList)】

LinkedList底层通过双向链表实现&#xff0c;双向链表的每个节点都包含对前一个元素和后一个元素的引用。当需要查询元素时&#xff0c;可以从头遍历&#xff0c;也可以从尾部遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。LinkedList允许元素为null。 LinkedList…

模拟信号的离散化

本文介绍模拟信号的离散化。 1.采样定理 定义&#xff1a;若想重建输入的模拟信号&#xff0c;采样频率必须大于等于输入模拟信号最高频率的2倍&#xff0c;即&#xff1a; 其中&#xff0c;为采样频率&#xff0c;为输入模拟信号最高频率 否则&#xff0c;信号会发生混叠 2…

基于JSP+Mysql+HTml+Css鲜花水果购物商城系统设计与实现

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

selenium入门篇(环境搭建、八大定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型 …

每年首版次测试报告的要求有哪些?

每年首版次测试报告的要求可能因不同的地区、行业或产品而有所差异&#xff0c;但一般而言&#xff0c;它们通常遵循一些基本的标准和原则。以下是一些常见的首版次测试报告要求&#xff1a; 完整性&#xff1a;测试报告应包含所有必要的测试内容&#xff0c;包括但不限于测试…