0

我有一个通过远程查询数据库部分加载的提要(UITableView)。数据库包含我必须检索的 1000 行。我在每个查询中检索 10 行。结果主要包含文本,但我也为每一行存储图像。所以我首先检索前十行,当用户在第 10 行末尾向下滚动 UITableView 时,我进行另一个查询以获取接下来的十行。到目前为止,我的 nsmutablearray 中总共存储了 20 行。这个过程一直持续到我得到 170 行。然后我在 Xcode 中遇到内存问题,应用程序崩溃。所以我想弄清楚如何在 UITableView 中加载所有 1000 行而不会使应用程序崩溃。

我正在考虑每次执行新查询时都删除前 10 行,因此 nsmutablearray 将始终有 10 个对象。我想对了吗?我是第一次这样做。

任何帮助表示赞赏。谢谢。

4

3 回答 3

2

如果你正在加载一个表格视图,那不是你这样做的。您按需加载行cellForRowAtIndexPath并让 iOS 删除不在视图中的行。当您创建一个新单元格时,您使用dequeueReusableCellWithIdentifier并且仅在该调用返回 nil 时创建一个新单元格。

元素将根据需要从您的数据库中检索,因此您在主内存中的现有单元中一次永远不会超过 15-20 个。

在某些情况下,您可能有关于要保存在主内存中的单个单元格的数据,但通常每行应该只有几个小对象——将这么多的对象放入 1000 个元素的 NSArray 中不是问题。

您不会保留您创建的所有单元格的数组 - iOS 会这样做,然后它将释放那些滑出屏幕的单元格,以保留存储空间。

于 2012-09-21T00:35:31.153 回答
1

您是否想过将核心数据与 NSFetchResultsController 一起使用?将它们一起使用将帮助您在大多数情况下避免任何内存问题

于 2012-09-21T00:28:44.597 回答
0

我会在数组中保留 3 页的行。您想要前一页和前一页。这将加速您的界面。您不想冒险让异步接口等待同步数据库调用。如果没有超级关闭的原因,我也不会将图像存储在数据库中。

于 2012-09-21T02:21:20.833 回答