iOS中的内存缓存和磁盘缓存

      在项目中我们难免会用到一些缓存方式来保存服务器传过来的数据,以减少服务器的压力。 缓存的方式分为两种分别为内存缓存和磁盘缓存,内存缓存速度快容量小,磁盘缓存(沙盒)容量大速度慢可持久化。

现将参考的文章列出来  内存缓存和磁盘缓存  SDWebImage缓存策略

    缓存分为内存缓存和磁盘缓存两种,其中内存是指当前程序的运行空间,缓存速度快容量小,是临时存储文件用的,供CPU直接读取,比如说打开一个程序,他是在内存中存储,关闭程序后内存就又回到原来的空闲空间;磁盘是程序的存储空间,缓存容量大速度慢可持久化与内存不同的是磁盘是永久存储东西的,只要里面存放东西,不管运行不运行 ,他都占用空间!磁盘缓存是存在Library/Caches。

一  内存缓存

iOS内存分为5个区:栈区,堆区,全局区,常量区,代码区

栈区stack:这一块区域系统会自己管理,我们不用干预,主要存一些局部变量,以及函数跳转时的现场保护。因此大量的局部变量,深递归,函数循环调用都可能导致内存耗尽而运行崩溃。

堆区heap:与栈区相对,这一块一般由我们自己管理,比如alloc,free的操作,存储一些自己创建的对象。

全局区(静态区static):全局变量和静态变量都存储在这里,已经初始化的和没有初始化的会分开存储在相邻的区域,程序结束后系统会释放

常量区:存储常量字符串和const常量

代码区:存储代码

代码区为低地址->栈区为高地址 

二 磁盘缓存

    iOS应用程序只能在该程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等

默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。

 Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录

        Library:存储程序的默认设置或其它状态信息;

        Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除.

        Library/preferences: 存放的是 user default 存储的信息,iTunes会备份此目录, 应用程序重新启动不会丢弃数据,我们使用 NSUserDefaults写的设置数据都会保存到该目录下的一个plist文件中,这就是所谓的写到plist中!

        tmp:提供一个即时创建临时文件的地方, iTunes不会备份此目录

    用户生成的文件放在documents,自己的文件放在library/cache里面,简单的说明:如果你做个记事本的app,那么用户写了东西,总要把东西存起来。那么这个文件则是用户自行生成的,就放在documents文件夹里面。如果你有一个app,需要和服务器配合,经常从服务器下载东西,展示给用户看。那么这些下载下来的东西就放在library/cache。apple对这个很严格,放错了就会被拒。主要原因是ios的icloud的同步问题。

三 应用

    SDWebImage使用NSCache类来实现内存缓存。

    在加载图片的时候,SDWebImage调用SDImageCache先读取内存缓存,如果内存缓存没有,就会使用GCD开启异步线程去读取磁盘缓存,如果找到磁盘缓存,则同步到内存缓存中去,使用GCD在主线程中设置图片,如果都没有,下载后会缓存到内存和磁盘上(可选)。

    SDWebImage 默认会有一个对上次加载失败的图片拒绝再次加载的机制。 也就是说,一张图片在本次会话加载失败了,如果再次加载就会直接拒绝。(额外知识)

    SDWebImage 会在每次 APP 结束的时候执行清理任务。 清理缓存的规则分两步进行。 第一步先清除掉过期的缓存文件。 如果清除掉过期的缓存之后,空间还不够。 那么就继续按文件时间从早到晚排序,先清除最早的缓存文件,直到剩余空间达到要求。具体点,SDWebImage 是怎么控制哪些缓存过期,以及剩余空间多少才够呢?maxCacheAge是文件缓存的时长,maxCacheAge 的默认值,注释上写的很清楚,缓存一周,SDWebImage 在默认情况下不会对缓存空间maxCacheSize设限制。分别在应用进入后台和结束的时候,遍历所有的缓存文件,如果缓存文件超过 maxCacheAge 中指定的时长,就会被删除掉。(额外知识)

[SDImageCache sharedImageCache].maxCacheSize = 1024 * 1024 * 50;// 50M

maxCacheSize 是以字节来表示的,我们上面的计算代表 50M 的最大缓存空间。 把这行代码写在你的 APP 启动的时候,这样 SDWebImage 在清理缓存的时候,就会清理多余的缓存文件了。(额外知识)

常见的内存缓存有NSCache、TMMemoryCache、PINMemoryCache、YYMemoryCache。常见的磁盘缓框架存有TMDiskCache、PINDiskCache、YYCache。

你可能感兴趣的:(iOS中的内存缓存和磁盘缓存)