从内存的角度来看,具有非持久存储的 NSArray 和 Core Data 是如何工作的?

Posted

技术标签:

【中文标题】从内存的角度来看,具有非持久存储的 NSArray 和 Core Data 是如何工作的?【英文标题】:How does NSArray and Core Data with a non-persistent store work from a memory perspective? 【发布时间】:2014-04-14 18:10:09 【问题描述】:

这是一个相当简单的问题,但我无法在搜索中找到明确的答案。

如果我有一个NSArray,并在其中添加 50 个 1MB UIImages,那 50MB 是从哪里扣除的?该应用程序会使用 50MB 以上的内存吗?它会简单地将其存储在磁盘上吗?

Core Data 也是如此,我将其存储在内存中,而不是使用持久存储。 Core Data 存储的大小会完全占用那么多内存/RAM,还是会存在于磁盘上并在应用程序完成执行时被擦除?

我担心是否应该在NSArray 中的UIImages 中存储几十兆字节,或者是否应该使用NSCache(我宁愿不使用,因为我宁愿从不丢失任何图像)。

【问题讨论】:

在内存中保留尽可能少的图像。您将使用比原始图像数据更多的内存。仅当您采取措施使其发生时才会将其写入磁盘。 【参考方案1】:

如果我有一个 NSArray,并向其中添加 50 个 1MB UIImages,那么在哪里 那50MB会被扣除吗?应用会多使用 50MB 内存吗?

是的。

它会简单地将其存储在磁盘上吗?

否。数组存储在内存中。

Core Data 也是如此,而不是使用持久存储 我将它存储在内存中。核心数据存储的大小是否会占用 正是那么多内存/RAM,或者它会存在于磁盘上并被擦除 应用何时完成执行?

是的,如果您告诉 Core Data 将内存中的所有内容都记录下来,那正是它会做的事情。

如果您认为虚拟内存系统可以将实际内存的页面交换到磁盘并在需要时将它们读回,那么“内存”和“磁盘”之间的界限可能会有点模糊。不过,这对 ios 来说不是问题,因为 iOS doesn't provide a VM backing store 和可写内存永远不会被换出。

我担心我是否应该存储几十个 NSArray 中 UIImages 的兆字节,或者我应该使用 NSCache

当然,这些不是您唯一的选择。您可以将图像存储在文件中并根据需要读取它们。当然,您应该考虑您的应用程序使用内存和磁盘空间的方式,但您还需要考虑网络使用、电池使用和性能。将数据存储在磁盘上通常比重新下载更可取,因为下载需要时间,可能会影响用户的数据计划,并且比仅从二级存储读取数据消耗更多的能量。

【讨论】:

SDWebImage 之类的库如何声称“保证不会多次下载相同的 URL”。下载一次后 URL 会发生什么变化?如果我下载数百张图片,是否会使用数百 MB 的 RAM? @DougSmith 根据该项目,SDWebImage 提供了“具有自动缓存过期处理的异步内存+磁盘图像缓存”。我不认为保证是一成不变的——如果你下载的图片太多以至于你想要的图片被从缓存中删除,就必须重新下载。

以上是关于从内存的角度来看,具有非持久存储的 NSArray 和 Core Data 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

从内存分配的角度来看 ArrayList 与 LinkedList

从应用角度谈谈NoSQL 数据库和关系型数据库的区别之处

Spark Web UI,即使我不持久化数据也显示非零内存存储数字

ActiveMQ 消息存储

表设计与SQL优化

RAMROM硬盘区别