【问题标题】:Core Data memory management核心数据内存管理
【发布时间】:2011-03-15 08:36:22
【问题描述】:

只是想确保我在 Core Data 的内存管理方面做得正确。

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

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

【问题讨论】:

    标签: iphone memory-management core-data


    【解决方案1】:

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

    话虽如此,我不明白为什么您需要获取可能很大的数据集并在标签栏视图中保留它,但您最多可以同时显示六个按钮,如果您有自定义页面 在用户难以滚动浏览之前,可以实际放入多少个选项卡?可能超过两打,您就会遇到 UI 问题,甚至在像 iPhone 这样内存不大的设备上也是如此。

    【讨论】:

    • 抱歉误导。我没有将这些数据填充到选项卡栏中,而是选项卡栏控制器视图之一,实际上是滚动视图。滚动视图中的每一页代表一条记录。用户可以滚动到几个项目或整个数据库。
    • 这仍然没有给我任何你在谈论的范围。如果整个数据库有约 100 条记录,则无关紧要,如果是约 1,000,000 条,则可以。如果确实很重要,那么我建议您为获取请求选择合理的批量大小,并在每次获取时确定固定数量的对象。如果用户滚动到您拥有的对象之外,那么您将使用新的限制进行提取。查看fetchOffsetfetchLimit。和fetchBatchSize NSFetchRquest 的属性。
    【解决方案2】:

    该解决方案很好,尽管您可能想查看NSFetchedResultsController,因为它会为您做很多繁重的工作。

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

    【讨论】:

      猜你喜欢
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多