我有一个应用程序,目前在内存中保存所有状态。它从服务器获取大量信息作为JSON,然后保留在内存中的JSON值。每个JSONObject
可以是~300个字节,并且可以有数千个这样的对象。
我只是使用这些数据来填充UITableView
。
为了更好地处理大量的aata,我修改了我的代码以从服务器获取数据并使用CoreData存储它。 JSON对象可以表示为简单实体,每个实体具有3个NSString
属性和1个int32属性。我创建了NSFetchedResultsController
作为UITableView
的数据源。我的假设是这会减少我的应用程序的驻留内存使用量(我假设NSFetchedResults
控制器有效地管理内存以不保存未在视图中显示的实体,而不是将所有状态保存在内存中。
出于本讨论的目的,我们假设我的应用程序清除了CoreData存储,并在每次运行时重新获取所有数据。
当我使用仪器中的VM Tracker测量驻留内存和虚拟大小的变化时,我注意到这两个值几乎完全相同。事实上,我的应用程序的基于Core-Data的版本似乎使用的内存比我完全在内存中的所有内容都要多。
虽然这可能是真的,但我没有直觉为什么会这样。有什么解释吗? 从我对我的应用程序的说法来看,听起来我不想在CoreData中持续存在,为什么?
答案 0 :(得分:4)
如果有内存,核心数据可以使用更多内存。但是,Core Data的一个好处是当你进入低内存状态时。当发生这种情况时,Core Data将尽可能自动减少自己的内存占用。
另一件需要考虑的事情是你让Core Data对这些对象进行了故障吗?如果您正在拉入1000个对象并显示其中的10个,则其他990应该处于故障状态,因此占用的内存较少。
我会浏览核心数据工具,确保你没有意外地意识到所有这些对象,并且无意中导致你的内存使用率高于它需要的值。
听起来您正在导入此数据,如果您没有看到任何故障,请不要正确刷新Core Data。
假设您在首次启动时加载此数据(我不会这样做,我会预先加载应用程序并完全避免使用plist文件),您想在{{1}上调用-reset
加载完成后,任何未使用的对象都会被刷新内存。然后,当数据重新进入内存(使用中)时,它将被正确排除故障。
最后,请确保您使用的是SQLite商店。否则这都是没有意义的。