NSCache缓存怎么来的
什么是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缓存怎么来的的更多相关文章
- iOS - OC NSCache 缓存
前言 NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本.用法与 NSMutableDictio ...
- IOS缓存之NSCache缓存
NSCache:专门做缓存的类 NSCache简介:NSCache是苹果官方提供的缓存类,用法与NSMutableDictionary的用法很相似,在AFNetworking和SDWebImage中, ...
- iOS NSCache缓存类的了解
前言: 最近面试时,问到了限定并发数的视频下载,当时回答的时通过GCD_barrier 处理,回来想想也可以通过NSCache处理,所以顺便复习一下,这个知识点. 一,关于NSCache说明 说明 ...
- NSCache 缓存
前言 NSCache 是苹果提供的一个专门用来做缓存的类,当内存 "不足" 或超过限制的时候,会自动清理缓存,使用时可以指定缓存的数量和成本. 用法与 NSMutableDicti ...
- 第二篇、为UITableViewCell 高度自适应加速 缓存cell的高度
通过NSCache缓存已经算好的行高 @interface ZHCellHeightCalculator : NSObject //系统计算高度后缓存进cache -(void)setHeight:( ...
- 探究react-native 源码的图片缓存
先看js端图片使用的三种方式,依次排序1.2.3 <Image source={{uri:url}} style={{width:200,height:200}}/> 1. 加载远程图片 ...
- 关于UIImageView缓存加载的笔记
加载图片的两个方法: [UIImage imageNamed:] [[UIImage alloc] initWithContentsOfFile: imgpath] [UIImage imageNam ...
- iOS开发中可能有用的那些分类们Categories
Categories是给你得不到源码的classes增加功能的一种方法. UIImageView+FaceAwareFill 这个类别使用了Aspect Fill内容模式,可以自动根据图像内容进行调整 ...
- ObjectiveC 文件操作二
10,文件委托,以便操作文件.头部看起来像是这样. @interface MyFileManager : NSObject @property(strong)NSFileManager *fileMa ...
随机推荐
- js之美
http://fxck.it/post/72326363595 大部分脚本语言里字面量都要快一些,因为解析[]比解析new Array()步骤少的多 关于Object可以用constructor注入的 ...
- 利用反汇编手段解析C语言函数
1.问题的提出函数是 C语言中的重要概念.利用好函数能够充分利用系统库的功能写出模块独立.易于维护和修改的程序.函数并不是 C 语言独有的概念,其他语言中的方法.过程等本质上都是函数.可见函数在教学中 ...
- IOC DI SL的一些理论
本文来自圣杰的简书 圣杰 yubinfeng的 这篇文章也很不错 很简单
- Windows下静态编译Qt4
既然是静态编译,那就要编译出来的程序不信赖于任何dll文件.首先下载qt-win-opensource-4.7.4-mingw.exe: http://get.qt.nokia.com/qt/sour ...
- WPF 3D中多个模型如何设置某一个在最前?
原文:WPF 3D中多个模型如何设置某一个在最前? 问题:我们的模型包括导入的3D solid模型和axis坐标轴模型,当模型旋转的时候,3D会将axis挡住. 期望:axis一直在最前面,不会被3D ...
- 《Silk》(皇家律师)—— 英美海洋法系
Abortion Act:堕胎法: 1. 表达习惯 we employ him, not the other way round, Officially,-,官方的说法是,Unofficially,- ...
- python 教程 第十九章、 图形界面编程
第十九章. 图形界面编程 import Tkinter top = Tkinter.Tk() hello = Tkinter.Label(top, text='Hello World!') hello ...
- 许多其他C++的class样本
class A{ public: A(){}//构造函数,作用分配类所需的空间 }; int main() { A a; } a它是类A示例! 版权声明:本文博客原创文章.博客,未经同意,不得转 ...
- x86汇编指令脚本虚拟机
简介 这是一个可以直接解释执行从ida pro里面提取出来的x86汇编代码的虚拟机. 非常精简,整体架构上不能跟那些成熟的虚拟机相比,主要目标是够用.能用.轻量就行,如果觉得代码架构设计的不是很好的话 ...
- 【Ubuntu】查看系统资源占用(内存,cpu和进程)
1 top 查看ubuntu的资源占用的命令为 $: top 说明:top命令就可以查看内存,cpu和进程了,很方便 top: 主要参数: d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果 ...