什么是NSCache

NSCache主要用来存储临时数据(键值对),当内存资源不够时,系统会自动释放部分数据。它有三个特点:
• NSCache为了保持不占用过多的系统内存,它有多种自动回收内存策略;当系统内存出现不足时,它会回收部分内存使系统正常运转,这种回收是不可控的。
• 可以在多线程中对NSCache进行访问,同时不需要加锁,因为它是线程安全的。
• 与NSMutableDictionary不同,NSCache不会copy其内部的键对象。

由上边的特点看出,NSCache是一个很好的内存缓存类,通过它我们可以实现数据的缓存功能。常见的开源框架中也有NSCache的使用,AFN的图片缓存,SDWebImage等。

NSCache测试

下面验证NSCache的特性,包含三个部分。NSCache的缓存能力有多大?多线程访问下是否安全?是否会copy其内部对象?

1. 缓存能力
NSCache提供了totalCostLimit和countLimit属性让外界能够对其进行缓存大小和缓存数量进行限制,但是不精确。网上其他的帖子说到大约NSCache的缓存能力是500M,现在我们对其验证。

NSCache *cache = [[NSCache alloc] init];
    
    int a = 0;
    while (YES) {
        NSString *string = @"一长串字符串"; // 大约1000个左右字符
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        NSString *key = [NSString stringWithFormat:@"%d", a];
        [cache setObject:data forKey:key];
        a++;
    }

通过上述的代码运行在iPhone6上,内存升到600M多点直接崩溃,那么极限是500多应该是正确的。同时在快速达到内存极限时,系统是来不及释放回收的,使用时应当注意,而且上边的代码是死循环,速度非常快。

2. 多线程访问

多线程访问单独读取是不会造成问题的,除非访问线程数过多,这里我们模拟多线程同时写入的情况。

NSCache *cache = [[NSCache alloc] init];
    NSString *string = @"一长串字符串"; // 大约1000个左右字符
    for (int i = 0; i < 10; i++) {
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [cache setObject:[NSString stringWithFormat:@"%d%@",i,string] forKey:@"MulPth"];
            NSLog(@"object is %@", [cache objectForKey:@"MulPth"]);
        });
    }

string若设置为特别短的字符串,效果可能不是很明显,所以将缓存能力中的字符串拷贝过来测试,从打印结果看,时间戳有明显差异,同时顺序也不是0123456789,而其余的内容一致,可以得出是线程安全的。
本质上,NSCache在其内部使用了pthread_mutex互斥锁进行线程安全保护。

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 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本. 用法与 NSMutableDicti ...

  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. eclipes 常用的快捷键 , 修改字体

    内容辅助键  Alt+/ 自动补齐main方法  main 然后 Alt+/ 自动补齐输出语句  syso 然后 Alt+/ 格式化Ctrl+Shift+f 代码区域右键 -- Source – Fo ...

  2. ssh基础(1)

    1.链接远程 命令:ssh root@1.1.1.1 2.执行远程脚本 命令:ssh root@1.1.1.1  /data/demo/test.sh > 111.txt   (执行远程的tes ...

  3. WPF UserControl 的绑定事件、属性、附加属性

    原文:WPF UserControl 的绑定事件.属性.附加属性 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/arti ...

  4. go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2]

    go 工具链目前[不支持编译 windows 下的动态链接库][1],不过[支持静态链接库][2].想要产生dll,可以这样 workaround ,参考 golang [issuse#11058][ ...

  5. Latex 琐碎

    χ(\chi),Ξ(\Xi),ξ(\xi) 0. 加颜色 x2+y2=z2({\color{Red} {x^2+y^2=z^2}}) Magenta, Cyan, Emerald(宝石绿) 1. 斜杠 ...

  6. Entity Framework加载数据的三种方式。

    MSDN文章Loading Related Entities 有 Eagerly Loading Lazy Loading Explicitly Loading 三种方式. 而看到查询中包含Inclu ...

  7. 利用反汇编手段解析C语言函数

    1.问题的提出函数是 C语言中的重要概念.利用好函数能够充分利用系统库的功能写出模块独立.易于维护和修改的程序.函数并不是 C 语言独有的概念,其他语言中的方法.过程等本质上都是函数.可见函数在教学中 ...

  8. vector删,erase和remove难怪--【STL】

    供vector使用容器.通常只是一个简单的遍历查找,其他操作已执行,这不是,今天,稍有不慎. erase方法的操作是将此时的节点删除,然后指向被删除节点的下一个: 如对数据1 6 6 4 7; #in ...

  9. 用游戏杆控制WPF中三维模型

    原文:用游戏杆控制WPF中三维模型 用游戏杆控制WPF中三维模型   今天心情比较好,不写WF的文章了,换个主题.写一个我最最最擅长的内容.   例子下载: http://files.cnblogs. ...

  10. 【转】opencart 源码解析

    前台控制程序列表-catalog/controller Catalog|controller|account 会员功能 |—— account.php 会员功能主頁|—— address.php 会员 ...