使用核心数据与内存中的内存占用优势不明显/明显 - 意见?

时间:2010-08-18 22:10:14

标签: iphone performance core-data ios

我有一个应用程序,目前在内存中保存所有状态。它从服务器获取大量信息作为JSON,然后保留在内存中的JSON值。每个JSONObject可以是~300个字节,并且可以有数千个这样的对象。 我只是使用这些数据来填充UITableView

为了更好地处理大量的aata,我修改了我的代码以从服务器获取数据并使用CoreData存储它。 JSON对象可以表示为简单实体,每个实体具有3个NSString属性和1个int32属性。我创建了NSFetchedResultsController作为UITableView的数据源。我的假设是这会减少我的应用程序的驻留内存使用量(我假设NSFetchedResults控制器有效地管理内存以不保存未在视图中显示的实体,而不是将所有状态保存在内存中。 出于本讨论的目的,我们假设我的应用程序清除了CoreData存储,并在每次运行时重新获取所有数据。

当我使用仪器中的VM Tracker测量驻留内存和虚拟大小的变化时,我注意到这两个值几乎完全相同。事实上,我的应用程序的基于Core-Data的版本似乎使用的内存比我完全在内存中的所有内容都要多。

虽然这可能是真的,但我没有直觉为什么会这样。有什么解释吗? 从我对我的应用程序的说法来看,听起来我不想在CoreData中持续存在,为什么?

1 个答案:

答案 0 :(得分:4)

如果有内存,核心数据可以使用更多内存。但是,Core Data的一个好处是当你进入低内存状态时。当发生这种情况时,Core Data将尽可能自动减少自己的内存占用。

另一件需要考虑的事情是你让Core Data对这些对象进行了故障吗?如果您正在拉入1000个对象并显示其中的10个,则其他990应该处于故障状态,因此占用的内存较少。

我会浏览核心数据工具,确保你没有意外地意识到所有这些对象,并且无意中导致你的内存使用率高于它需要的值。

更新

听起来您正在导入此数据,如果您没有看到任何故障,请不要正确刷新Core Data。

假设您在首次启动时加载此数据(我不会这样做,我会预先加载应用程序并完全避免使用plist文件),您想在{{1}上调用-reset加载完成后,任何未使用的对象都会被刷新内存。然后,当数据重新进入内存(使用中)时,它将被正确排除故障。

最后,请确保您使用的是SQLite商店。否则这都是没有意义的。