NSCache

【多线程-第四天-NSCache Objective-C语言】 阅读详情

NSCache是系统提供的一种类似于集合(NSMutableDictionary)的缓存,它与集合的不同如下:

1. NSCache具有自动删除的功能,以减少系统占用的内存;

2. NSCache是线程安全的,不需要加线程锁;

3. 键对象不会像 NSMutableDictionary 中那样被复制。(键不需要实现 NSCopying 协议)。

NSCache的属性以及方法介绍:


@property NSUInteger totalCostLimit;

设置缓存占用的内存大小,并不是一个严格的限制,当总数超过了totalCostLimit设定的值,系统会清除一部分缓存,直至总消耗低于totalCostLimit的值。

@property NSUInteger countLimit;

设置缓存对象的大小,这也不是一个严格的限制。

- (id)objectForKey:(id)key;

获取缓存对象,基于key-value对

- (void)setObject:(id)obj forKey:(id)key; // 0 cost

存储缓存对象,考虑缓存的限制属性;

- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;

存储缓存对象,cost是提前知道该缓存对象占用的字节数,也会考虑缓存的限制属性,建议直接使用  - (void)setObject:(id)obj forKey:(id)key;

NSCacheDelegate代理


代理属性声明如下:

@property (assign) id<NSCacheDelegate>delegate;

实现了NSCacheDelegate代理的对象,在缓存对象即将被清理的时候,系统回调代理方法如下:

- (void)cache:(NSCache *)cache willEvictObject:(id)obj;

第一个参数是当前缓存(NSCache),不要修改该对象;

第二个参数是当前将要被清理的对象,如果需要存储该对象,可以在此操作(存入Sqlite or CoreData);

该代理方法的调用会在缓存对象即将被清理的时候调用,如下场景会调用:

1. - (void)removeObjectForKey:(id)key; 手动删除对象;

2. 缓存对象超过了NSCache的属性限制;(countLimit 和 totalCostLimit )

3. App进入后台会调用;

4. 系统发出内存警告;

NSDiscardableContent协议


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

一个NSDiscardableContent对象的生命周期依赖于一个“counter”变量。一个NSDiscardableContent对象实际是一个可清理内存块,这个内存记录了对象当前是否被其它对象使用。如果这块内存正在被读取,或者仍然被需要,则它的counter变量是大于或等于1的;当它不再被使用时,就可以丢弃,此时counter变量将等于0。当counter变量等于0时,如果当前时间点内存比较紧张的话,内存块就可能被丢弃。这点类似于MRC&ARC,对象内存回收机制。

- (void)discardContentIfPossible

当counter等于0的时候,为了丢弃这些对象,会调用这个方法。

默认情况下,NSDiscardableContent对象的counter变量初始值为1,以确保对象不会被内存管理系统立即释放。

- (BOOL)beginContentAccess    (counter++)

调用该方法,对象的counter会加1;

与beginContentAccess相对应的是endContentAccess。如果可丢弃内存不再被访问时调用。其声明如下:

- (void)endContentAccess  (counter--)

该方法会减少对象的counter变量,通常是让对象的counter值变回为0,这样在对象的内容不再被需要时,就要以将其丢弃。

NSCache类提供了一个属性,来标识缓存是否自动舍弃那些内存已经被丢弃的对象(默认该属性为YES),其声明如下:

@property BOOL evictsObjectsWithDiscardedContent

如果设置为YES,则在对象的内存被丢弃时舍弃对象。

个人建议:如果需要使用缓存,直接用系统的NSCache就OK了,不要做死。

NSCache就写到这里了,欢迎大家来指正错误,我们一起进步,感谢大家的阅读。

Windows下用RKDevTool解包update.img的完整流程(含常见错误排查) 本文详细介绍了在Windows系统下使用RKDevTool工具解包update.img固件的完整流程。从工具准备、环境搭建到逐步解包操作,重点解析了输出文件结构,并提供了修改分区后重新打包的实战方法。文章还针对解包失败、打包错误等常见问题提供了详细的排查与解决方案,旨在帮助嵌入式开发者和爱好者高效完成固件分析与定制工作。 阅读详情

相关推荐

在统信UOS Server 20上踩坑记:手把手教你搞定openGauss 5.0.0企业版安装(附常见报错解决方案)

本文详细记录了在统信UOS Server 20上安装openGauss 5.0企业版的实战经验,包括环境准备、依赖库问题、目录权限、内存参数调优等常见问题的解决方案。通过伪装系统标识、建立软链接、调整内存参数等方法,成功克服国产操作系统与企业级数据库的兼容性挑战,为开发者提供了一份深度排雷指南。

weixin_28698059的博客 261

iOS——NSCache

NSCache是Foundation框架中的一个类,用于在iOS和macOS应用程序中进行临时性的内存缓存。它提供了一种轻量级的缓存机制,可以用于存储临时性的数据,例如图片、对象等。:NSCache用于存储需要临时性缓存的数据,这些数据在应用的生命周期内需要频繁访问,但并不需要永久保存。:NSCache会自动管理缓存中的对象,当系统内存不足时,NSCache会自动释放部分缓存对象以腾出内存空间。:NSCache使用键值对的方式来存储和访问缓存数据。通过键(Key)可以快速查找对应的值(Value)。

m0_73348697的博客 1914

ESP32 驱动 SYN6288 语音合成:Arduino IDE 下实现中文数字混合文本的智能播报

本文详细介绍了如何在Arduino IDE环境下使用ESP32驱动SYN6288语音合成模块,实现中文数字混合文本的智能播报。通过硬件选型、开发环境搭建、编码转换原理、命令帧构造及串口通信实战等步骤,帮助开发者快速掌握语音播报技术。文章还提供了混合文本处理技巧和常见问题排查方法,适合智能硬件开发者参考。

weixin_42553471的博客 448

NSCache缓存类的详解

NSCache:专门做缓存的类 NSCache简介:NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中,使用它来管理缓存。 NSCache在系统内存很低时,会自动释放一些对象(出自苹果官方文档,不过在模拟器中模拟内存警告时,不会做缓存的清理动作) 为了确保接收到内存警告时能够真正释放内存,最好调用一下r...

iteye_18817的博客 499

抖音短连接v.douyin.com/xxx 如何生成?

最近公司有个需求,在抖音里如何宣传自己的网站,并且不要有拦截域名的提示,截图如下。 通过ida反编译抖音的app后,将下载后的ipa文件用解压缩软件(如7zip等)解压,从解压后的目录Payload/Aweme.app/找到Aweme可执行文件,拖入ida进行反编译,ida可以检测objective-c语法。 然后进入主题,既然是聊天发消息,就尝试在ida里搜索"message",看看能否找到对...

kakuapi的博客 3万+

深入解析APS开源排程工具OptaPlanner:链式结构与移动优化

本文深入解析了开源APS排程工具OptaPlanner的核心机制,重点阐述了链式结构如何作为排程优化的“骨架”,通过单一`previous`变量隐式定义资源与顺序,从而简化建模。文章详细介绍了基于此结构的移动操作(如`ChainChangeMove`)如何驱动优化引擎探索解空间,并自动触发影子变量更新与分数计算,为构建高效、灵活的生产计划系统提供了实践指导。

keras9composer的博客 296

iOS数据持久化设计

一、目标 了解移动端的数据持久化方式和对应的使用场景,提供相关技术选型做技术储备。 二、数据持久化的目的 快速展示,提升体验 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户 节省用户流量(节省服务器资源) 对于较大的资源数据进行缓存,下次展示无需下载消耗流量 同时降低了服务器的访问次数,节约服务器资源。(图片) 离线使用。 用户浏览过的数据无需联网,...

weixin_33785108的博客 651

”COMSOL“竟然如此简单!我悟了!!

COMSOL Multiphysics具有强大的多物理场全耦合仿真分析功能、高效的计算性能,可以保证数值仿真的高度精确,已被广泛应用于各个学科领域,近年来运用COMSOL来解决电化学实际工程问题也越来越普遍。

C1012562281的博客 3447

手写NSCache及开源实现的分析

NSCache是什么 NSCache是苹果提供的内存缓存框架。它和NSMutableDictionary和用法很相似,但NSCache是线程安全的,并且没有对Key进行copy。虽然官方文档中没有明确指出缓存淘汰策略,但从测试来看,目前使用的是LRU缓存淘汰策略。 缓存淘汰策略 缓存的大小有限,当缓存被使用满时,我们需要清除掉部分数据,而清除哪些数据,由缓存淘汰策略决定。常见的算法有三种: 先进...

weixin_34220963的博客 340

基于步科(Kinco HMI 2.5)的组态软件使用

本篇介绍Kinco HMI 2.5的组态软件使用,图标如下 目录   一、新建工程并配置连接 1.1 根据工程选择PLC与HMI型号 1.2 配置PLC连接与选项 二、组态画面编辑 2.1 打开画面窗口 2.2 编辑画面 2.3 组态变量与PLC程序变量连接 三、组态程序下载到HMI 3.1 连接 3.2 编译 3.3 下载 一、新建工程并配置连接 1.1 根据工...

ACanswer的专栏 1万+

提示词驱动的智能合同生成与审核

第1章:核心概念与背景 1.1.1 问题背景 1.1.1.1 合同生成与审核的需求 合同作为商业和法律领域中的基本工具,其生成和审核过程至关重要。传统的合同生成往往依赖于法律专业人士的手工撰写,这不仅耗时耗力,而且容易出现错误。此外,合

AI天才研究院 999

NSCache和NSURLCache

NSCache  (1)可以存储(当然是使用内存) (2)保持强应用, 无视垃圾回收. =>这一点同 NSMutableDictionary (3)有固定客户. +---------------------------+------------------------------+ |        NSCache            |      NSMutableDicti

deep_explore的专栏 1万+

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | ICML 2024 | RT-DETR引入ICB交互式卷积模块和ASB自适应频谱模块,助力目标检测、异常检测有效涨点、含多种创新改进点

RT-DETR目标检测模型通过引入ICB和ASB模块实现性能提升。ICB模块采用多尺度卷积交互,有效捕获局部和长程依赖特征;ASB模块通过自适应频域滤波优化特征表示,降低噪声干扰。两者结合使模型在复杂场景中表现更优,显著提升检测精度和鲁棒性。文章详细介绍了模块原理、代码实现及配置方法,并提供了8种改进版本的YAML配置文件,适用于不同网络结构。这些创新改进为RT-DETR模型提供了高效涨点方案,特别适合复杂背景和高噪声环境下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 211

NSCache 原理 (著名开源框架SDWebImage 就是使用的NSCache实现的缓存)

NSCache是一个类似于集合的容器,即缓存。它存储key-value对,这一点类似于NSDictionary类。我们通常用使用缓存来临时存储短时间使用但创建昂贵的对象。重用这些对象可以优化性能,因为它们的值不需要重新计算。另外一方面,这些对象对于程序来说不是紧要的,在内存紧张时会被丢弃。如果对象被丢弃了,则下次使用时需要重新计算。 当一个key-value对在缓存中时,缓存维护它的一个强引

转身扭到脖子的专栏 4260

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NSCache的使用

NSCache是苹果公司自己开发的缓存类,其使用方法简单,并且可以设置最大缓存数量,当超出最大数量时自动回收先放入的对象。NSCache是线程安全的,在使用时不用担心因线程而出现的数据错误。 NSCache的接口 - (nullableObjectType)objectForKey:(KeyType)key; //根据key取出某条数据 - (void)setObject:(Obje...

bafengcha5874的博客 224

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

iOS之NSCache介绍

NSCache:专门做缓存的类 NSCache简介:NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中,使用它来管理缓存。 NSCache在系统内存很低时,会自动释放一些对象(出自苹果官方文档,不过在模拟器中模拟内存警告时,不会做缓存的清理动作) 为了确保接收到内存警告时能够真正释放内存,最

qq_28884869的博客 669

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

NSCache 缓存

前言 NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本。 用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,都使用它来管理缓存。 - (void)setObject:(id)obj forKey:(id)key cost:(NSUInte...

weixin_34319999的博客 93

ios NSCache的使用

NSCache第一次接触到是看SDWebImage的源码的时候,使用NSCache的子类做了图片的内存缓存. NSCache也可以做Key-Value的映射,但是不同于NSDictionary的地方在于: 1.当系统资源将要耗尽的,NSCache可以自动删减缓存,遵循了LRU(lease recently used)算法,如果是字典的话,就需要监听didReceiveMemoryWarning...

gcs的博客 1233

iOS NSCache内存优化

iOS列表item有图片时使用NSCache类提升性能

brycegao321的博客 1274

NSCache类的简单介绍

最近看SDWebImage,里面的内存缓存用到了NSCache这个类,由于以前没有使用过,特此记录学习一下。 NSCache NSCache是苹果官方提供的缓存类,用法和NSMutableDictonary非常类似. NSCache是一个类似于集合的容器,即缓存。它存储key-value,这一点非常类似字典。开发者一般用NSCache来缓存临时存储短时间但是使用成本高的对象。重用这...

ddiv24492的博客 188

NSCache的一点小小认识

在iOS开发的过程中,我们经常会遇到一个问题,那就是从网络下载的图片应该如何来存储,首先能够想到的可能就是使用字典把图片保存起来,那么下次再去请求的时候就可以直接使用而不需要下载了,但是使用字典未必是一个好的方案。其实NSCache类更好,因为它是Foundation框架专门为处理缓存而设计的。   NSCache NSCache是一个类似于集合的容器,它也存储key-value对,这一点类...

欢迎来到Jack的程序世界 1991

优化验证测试的一般形式:《机器学习训练秘籍》第 45 章深度解读

> 本文对应开源仓库 machine-learning-yearning-cn(《机器学习训练秘籍》中文版,Andrew Ng 著)"调试推断算法(Debugging inference algorithms)"章节中的第 45 章。它把第 44 章引入的"优化验证测试"抽象为通用形式:当系统由**近似得分函数 + 近似最大化算法**两部分组成时,仅凭一个得分不等式,就能把误差系统地归因到优化算法

gitblog_01054的博客 983

NSCache、NSDictionary、NSArray对比

NSCache、NSDictionary、NSArray 1.NSArray 作为一个存储对象的有序集合,可能使用最多的集合类 性能特征: 在数组的开头和结尾插入删除通常是直接操作O(1),而随机的插入和删除通常是O(n) 2.NSDictionary中的键是被拷贝的并且需要是恒定的,如果在一个键在被用于字典中放入一个值后被改变,那么这个值可能就会变得无法获取了。一个有趣的细节,在NSDictionary中键是被拷贝的,而在使用一个tool-free桥接的CFDictionary时却是被retain。Cor

仰望星空的博客 1081
上一篇: 关于头文件中的 static inline函数
下一篇: 数据存储方式IOS---归档与解档
网上的虫
博客等级 码龄11年 8粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值