iOS - OC NSCache 缓存

前言

  • 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 {

    }
时间: 2024-10-02 05:32:38

iOS - OC NSCache 缓存的相关文章

ios做数据缓存后,显示数据的逻辑是怎样的?

问题描述 ios做数据缓存后,显示数据的逻辑是怎样的? ios做数据缓存后,显示数据的逻辑是怎样的?因为有上拉加载更多,和下拉刷新,求思路 解决方案 iOS数据缓存iOS开发数据缓存玩转iOS开发 - 数据缓存 解决方案二: 1.获取服务器数据后,可以写入本地文件中,需要用到的时候再去读取就可以了: 2.分页的话类似的: 解决方案三: 每次加载页面都可以先从缓存里面读取,读不到再网络获取

ios oc对象不可以直接写到plist中..

问题描述 ios oc对象不可以直接写到plist中.. ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中..ios oc对象不可以直接写到plist中.. 解决方案 你可以写到 NSUserDefault 中, 也就是常说的 User setting, 可以把它当 NSDictionary 来用. 解决方案二: 必须是nsstring,array,dictionary,set等的子类 解决方案三: plist里面一般都是字典数组字符串之类的,你要存对象得

iOS - OC 面向对象语法

1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(category):允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之后的一对圆括号"( )"中. @interface QCStudent (Print) @end @implementation QCStud

iOS - ImageCache 网络图片缓存

1.ImageCache 使用内存缓存方式: 使用沙盒缓存方式: 使用网络图片第三方库方式: SDWebImage: iOS 中著名的网络图片处理框架 包含的功能:图片下载.图片缓存.下载进度监听.gif 处理等等 用法极其简单,功能十分强大,大大提高了网络图片的处理效率 国内超过 90% 的 iOS 项目都有它的影子 1.图片文件缓存的时间有多长? 1 周 _maxCacheAge = kDefaultCacheMaxCacheAge; // - (id)initWithNamespace:

iOS 数据库离线缓存思路和网络层封装

一直想总结一下关于iOS的离线数据缓存的方面的问题,然后最近也简单的对AFN进行了再次封装,所有想把这两个结合起来写一下.数据展示型的页面做离线缓存可以有更好的用户体验,用户在离线环境下仍然可以获取一些数据,这里的数据缓存首选肯定是SQLite,轻量级,对数据的存储读取相对于其他几种方式有优势,这里对AFN的封装没有涉及太多业务逻辑层面的需求,主要还是对一些方法再次封装方便使用,解除项目对第三方的耦合性,能够简单的快速的更换底层使用的网络请求代码.这篇主要写离线缓存思路,对AFN的封装只做简单的

iOS AFNetworking 数据缓存(3)

AFNetWorking 在IOS开发中是一个经常会用的第三方开源库,其最好处是维护及时,源码开源.  常用GET与POST请求方法: POST请求:  ? 1 2 3 4 5 6 7 8 9 //初始化一个请求对象  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];   NSString * url = @"你的请求地址";   //dic 为参数字典  [manager

iOS AFNetworking 数据缓存

How Does Caching Work in AFNetworking? : AFImageCache & NSUrlCache Explained FEB 20TH, 2014 If you are an iOS developer using  Mattt Thompson's 'delightful networking framework' AFNetworking (and if you aren't, what are you waiting for?), perhaps you

iOS - OC 语言新特性

前言 相对于 Java,OC 语言是一门古老的语言了,而它又是一门不断发展完善的语言.一些新的编译特性,为 OC 语言带来了许多新的活力.在 Xcode7 中,iOS9 的 SDK 已经全面兼容了 Objective-C 的一些新特 性和新功能.这些功能都只作用于编译期,对程序的运行并没有影响,因此,它可以很好的向下进行兼容,无缝的衔接低版本的 iOS 系统,如果可以将这些新特性都应用于开发,开发效率和代码质量,相比之前会有一个很大的提升. 1.可选类型检测 在 swift 语言中,通过 ! 和

iOS - OC 内存管理

1.OC 基本内存管理模型 1.1 自动垃圾收集 在 OC 2.0 中,有一种称为垃圾收集的内存管理形式.通过垃圾收集,系统能够自动监测对象是否拥有其他的对象,当程序执行需要空间的时候,不再被引用的对象会自动释放.iOS 运行环境并不支持垃圾收集,在这个平台开发程序时并没有这方面的选项.在 OS X 10.8 中垃圾收集已不再推荐使用. 1.2 自动释放池 自动释放池(autoreleasepool)的机制是它使得应用在创建新对象时,系统能够有效的管理应用所使用的内存.自动释放池可以追踪需要延时