2010-07-13 113 views
0

只是想确保我正在做的与Core Data的内存管理正确的事情。核心数据内存管理

在我的视图控制器(这是标签栏视图)viewDidLoad我用NSFetchRequest来检索我需要的行。然后我保留返回的NSArray对象,因为我需要等待用户交互来显示这部分数据。在viewDidUnload我释放该数组。

我担心的是数据何时会变得更多,这种机制会效率低下吗?无论如何,我只是使用它的一部分,但如果用户传递所有数据,则需要全部提取。

回答

0

虽然你可能想看看NSFetchedResultsController这个解决方案很好,因为它会为你做很多繁重的工作。

否则你很好,内存是为你处理的。当你进行一次抓取时,你会得到骨架对象(读取少量内存直到单独访问),如果它们没有被使用一段时间,它们可以变回骨架。这意味着Core Data将为您执行大部分内存管理。只要你坚持你的阵列,你就是金。

1

您的问题的答案完全取决于您的模型的结构以及您提取的对象数量。不受约束的对象非常小,但没有对象更好。如果你想聪明,你可以限制你的抓取大小,并根据需要在范围内引入对象。这就是NSFetchedResultsController所做的。

话虽如此,我不明白为什么你需要获取一个潜在的大型数据集并在标签栏视图中保留它,最多可以有六个按钮同时显示,如果你有一个定制页面有多少标签可以实际投入它之前,用户难以滚动浏览它?可能有二十多个,你将遇到UI问题,甚至在像iPhone这样的设备上也不是很大的内存。

+0

对不起,误导。我不是将这些数据填充到标签栏中,而是将其中一个标签栏控制器视图,实际上是滚动视图。滚动视图中的每个页面都代表一条记录。用户可以滚动到几个项目或整个数据库。 – Pablo 2010-07-14 02:23:19

+1

这仍然没有给我任何你谈论的范围。如果整个数据库大约有100条记录,那么它就无关紧要了,如果它是〜1,000,000条那么它就是这样。如果它确实重要,那么我建议你为你的提取请求选择一个合理的批处理大小,并且每次提取的固定数量的对象出错。如果用户滚动到超出对象的范围,那么您将执行新的限制。检出'fetchOffset','fetchLimit'。和NSFetchRquest的fetchBatchSize属性。 – 2010-07-15 04:13:15