什么是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互斥锁进行线程安全保护。

最新文章

  1. phpstorm10.0.1 注册
  2. php curl get
  3. Arch Linux sudo: PAM authentication error: Module is unknown [Solved!]
  4. windows目录选择 文件选择 文件保存对话框
  5. arcgis android 图上记录gps轨迹
  6. Java单例模式--------懒汉式和饿汉式
  7. 修改 suse 上的postfix 的日志路径
  8. Microsoft Visual Studio 产品密钥
  9. poj1201 Intervals【差分约束+SPFA】
  10. 1.2 sikuli API
  11. Javaweb学习(一):tomcat服务器配置与启动
  12. Git安装和使用(谨记)
  13. 大受喜欢安卓触控一体机连接云端数据化管理提供例程DEMO
  14. Zend:PHP框架结束的开始?
  15. conductor 系统任务
  16. android 网站上下的 adt 不能显示没有安装的
  17. Skype for Business Server 2015 企业语音部署和配置
  18. 个人技术博客二之apk反编译与加密
  19. VC中__int64的用法
  20. C++方式解析时间字符串和计算时间

热门文章

  1. yii2.0获取最后一条ID
  2. [Scikit-Learn] - 数据预处理 - 缺失值(Missing Value)处理
  3. WPF 3D Transparency Depth-Order Sorting
  4. C# ini
  5. mysql重置root密码,并设置可远程访问
  6. 多线程——继承Thread类别
  7. Java 知识笔记 - 类、集合、多线程、IO、JVM(最后一次更新,2019年02月17日)
  8. 最简单的IdentityServer实现——IdentityServer
  9. IOS开发之iOS深浅拷贝
  10. C# WinForm TreeView选择父节点子节点全选