前言

  • NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本。
  • 用法与 NSMutableDictionary 的用法很相似,在 AFNetworking 和 SDWebImage 中,都使用它来管理缓存。
- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;
  • 设置对象并指定 "成本",成本可以自行指定
  • 例子:缓存图片

    • 1、缓存 100 张图片
    • 2、将图片的"宽 * 高"当作成本,图像"像素",10M 当作缓存成本,无论缓存的多少张照片,只要像素值超过 10M,就自动清理缓存图像的时候,使用成本,比单纯设置数量要科学!
    • NSCache 是线程安全的,在多线程操作中,不需要对 Cache 加锁。
    • NSCache 的 Key 只是做强引用,与可变字典不同,缓存对象不会对键名做 copy 操作,不需要实现 NSCopying 协议。
    • 使用 NSCache 做缓存一定要保证能够有恢复的办法,这是能否使用 NSCache 做缓存的一个重要原则。
    • 例如:imageCache 可以使用 NSCache ,而 downloadQueueCache 不能使用!
    • 当超出限制之后,缓存会自动清理!缓存中的任何对象,都有可能被干掉。
    • 如果是图像缓存,内存中没有,会自动从沙盒加载。
    • 如果操作被释放,就没有回复的渠道!
    • 这个是是否使用 NSCache 做缓存的一个重要原则,一定要保证能够有恢复的办法!
  • 千万不要清理 NSCache

    • 一旦调用了 removeAllObjects,就无法给 cache 添加对象。
    • 关于 NSCache 的内存管理,交给他自己就行!
    • SDWebImage 中存在同样的问题,一旦内存警告,清理了内存之后,之后所有的图片都是从沙盒加载的。

1、NSCache 的使用

// 创建对象
NSCache *cache = [[NSCache alloc] init]; // 设置缓存数量限制,默认值是 0,表示没有限制
cache.countLimit = 10; // 设置缓存总成本限制,默认值是 0,表示没有限制
cache.totalCostLimit = 1024 * 1024; // 设置是否自动清理缓存,默认为 YES,表示自动清理
cache.evictsObjectsWithDiscardedContent = YES; // 设置代理
cache.delegate = self; // 设置缓存
/*
0 成本,与可变字典不同,缓存对象不会对键名做 copy 操作,只是做强引用
*/
[cache setObject:str forKey:@(i)]; // 设置缓存
/*
指定成本
*/
[cache setObject:str forKey:@(i) cost:1024]; // 查看缓存内容
/*
NSCache 没有提供遍历的方法,只支持用 key 来取值,NSCache 的 Key 只是做强引用,不需要实现 NSCopying 协议
*/
NSString *string = [cache objectForKey:@(i)]; // 删除指定缓存
[cache removeObjectForKey:@8]; // 删除所有缓存
/*
一旦调用了 removeAllObjects,就无法给 cache 添加对象,关于 NSCache 的内存管理,交给他自己就行
*/
[cache removeAllObjects]; // 缓存协议方法
/*
须遵守 <NSCacheDelegate> 协议,obj 就是要被清理的对象
当缓存中的对象被清除的时候,会自动调用,不建议平时开发时重写!仅供调试使用
*/
- (void)cache:(NSCache *)cache willEvictObject:(id)obj { }

NSCache 缓存的更多相关文章

  1. iOS - OC NSCache 缓存

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

  2. IOS缓存之NSCache缓存

    NSCache:专门做缓存的类 NSCache简介:NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中, ...

  3. iOS NSCache缓存类的了解

    前言:   最近面试时,问到了限定并发数的视频下载,当时回答的时通过GCD_barrier 处理,回来想想也可以通过NSCache处理,所以顺便复习一下,这个知识点. 一,关于NSCache说明 说明 ...

  4. NSCache缓存怎么来的

    什么是NSCache NSCache主要用来存储临时数据(键值对),当内存资源不够时,系统会自动释放部分数据.它有三个特点: • NSCache为了保持不占用过多的系统内存,它有多种自动回收内存策略: ...

  5. 第二篇、为UITableViewCell 高度自适应加速 缓存cell的高度

    通过NSCache缓存已经算好的行高 @interface ZHCellHeightCalculator : NSObject //系统计算高度后缓存进cache -(void)setHeight:( ...

  6. 探究react-native 源码的图片缓存

    先看js端图片使用的三种方式,依次排序1.2.3 <Image source={{uri:url}} style={{width:200,height:200}}/> 1. 加载远程图片 ...

  7. 关于UIImageView缓存加载的笔记

    加载图片的两个方法: [UIImage imageNamed:] [[UIImage alloc] initWithContentsOfFile: imgpath] [UIImage imageNam ...

  8. iOS开发中可能有用的那些分类们Categories

    Categories是给你得不到源码的classes增加功能的一种方法. UIImageView+FaceAwareFill 这个类别使用了Aspect Fill内容模式,可以自动根据图像内容进行调整 ...

  9. ObjectiveC 文件操作二

    10,文件委托,以便操作文件.头部看起来像是这样. @interface MyFileManager : NSObject @property(strong)NSFileManager *fileMa ...

随机推荐

  1. Linux Restricted Shell Bypass

    Author: @n4ckhcker & @h4d3sw0rm Introduction Hello, so first of all let’s explain what is a rest ...

  2. 安全测试之session,cookie

    session session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息.•但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这 ...

  3. python利用scapy模块写一个TCP路由追踪和扫描存活IP的脚本

    前言: 没有前言 0x01 from scapy.all import * import sys from socket import * import os from threading impor ...

  4. Usage of API documented as @since 1.8+”报错的解决办法

    参考资料 1.https://blog.csdn.net/a499477783/article/details/78967586/

  5. dokuwiki安装问题

    工作了几年,虽然在程序员这个道路上才算开始,希望以后能够有所成长,为了把平时遇到的技术问题,记录下来,第一个想到的就是写wiki,博客虽然创建了许久,但是没有坚持写下去,在网上找了许多的wiki程序, ...

  6. 中国大学MOOC 玩转AutoCAD 熟悉AutoCAD的工作空间

  7. Druid配置属性列表及含义

    前两天,在排查springBoot使用双数据源出现的运行一段时候出现了数据库连接断开的问题的时候,查了很多关于Druid数据库连接池配置的文章,虽然最后问题的原因不是属性配置的问题,也可以说是 属性配 ...

  8. 构造方法概念,自定义构造(init)方法的用途, 类工厂方法(就是直接用类名 类调用)

    一. 构造方法 构造方法:在OC中init开头的方法, 我们称之为构造方法 构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值 // 比如我们定义一个Person的类,然后 ...

  9. 编程中&&和||的妙用

    &&符号在编程中表示“和”,也就是数学中的“且”! if(A && B){ } 上面的代表表示A==true并且B==true的情况下就执行花括号里面的代码. 值得注意 ...

  10. 258. Add Digits 数位相加到只剩一位数

    [抄题]: Given a non-negative integer num, repeatedly add all its digits until the result has only one ...