UITableView 自定义 Cells,滚动和内存管理

Posted

技术标签:

【中文标题】UITableView 自定义 Cells,滚动和内存管理【英文标题】:UITableView custom Cells, scrolling and memory management 【发布时间】:2010-11-22 15:32:05 【问题描述】:

所以我有一个表格视图,我用自定义表格单元格填充。我遇到的问题是当大量项目开始填满表格时,它在滚动时开始变慢。 (我已经实现了一个动态滚动,所以当用户滚动时,有一个方法可以从服务器获取下一个 x 项,这样他们就可以滚动到他们心中的内容而无需刷新/按下任何东西。)

现在我从我在 IB 中构建的自定义模板创建单元格,并像这样初始化它们:

 CustomCellClass *cell = (CustomCellClass *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
    cell = (CustomCellClass *)[nib objectAtIndex:0];

在这种情况下,内存管理应该如何工作,这样我才不会占用大量内存并减慢滚动速度?任何帮助/建议/见解将不胜感激。谢谢!

编辑:我已经检查了内存泄漏,所以这不应该是问题。

【问题讨论】:

【参考方案1】:

因此,我在一个用于获取数据的数据控制器类中发现了根深蒂固的内存泄漏。这就是导致经济放缓的原因。我看到大量内存使用正在进行,但仪器没有检测到泄漏。只是表明没有比旧的手动调试更好的了。 :) 谢谢您的帮助。

【讨论】:

对表格单元的内存管理进行了改进。 :)【参考方案2】:

如果泄漏工具没有显示任何内容,有时可能值得使用堆快照。 关于它的文章在这里: http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

【讨论】:

谢谢。我去看看。【参考方案3】:

您显示的用于管理表格单元格的代码片段看起来不错。

根据您的描述,瓶颈似乎是从服务器(Web 服务?)的实际数据检索。您是在主线程还是单独的线程上进行 Web 服务调用?如果您还没有这样做,也许您可​​以在单独的线程上调用 Web 服务并创建“占位符”单元格,这些单元格会在 Web 服务完成后刷新。这应该保持 UI 响应,尽管您不一定会立即看到每个单元格中的数据(例如,在数据可用之前,它可能会说“正在加载”或类似的内容)。

【讨论】:

是的,我正在异步执行此操作,因此 UI 不会冻结。它工作得很好,但是当加载很多单元格时它会变得有点迟钝。这有点奇怪,因为如果我钻入一个单元然后返回,良好的性能就会恢复。所以我有点不知道为什么会这样...... 您可以将一些 NSLog 调用添加到您的 CustomCellClass 并观察 init/deallocs 以确保表格单元格的内存管理按预期工作。一旦你得到一个充满单元格的屏幕,它应该从那时起重用单元格(即,滚动时不应该有 init/dealloc)。这将告诉您问题出在表格单元格还是其他地方。 是的,有时很难看到摆在您面前的问题,直到您尝试向其他人解释它:-)。

以上是关于UITableView 自定义 Cells,滚动和内存管理的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中滚动的自定义视图

uitableview 自定义单元格在向下滚动 uitableview 时丢失其内容

UITableview 滚动时有两个不同的自定义单元格重叠

滚动会弄乱 UITableView 中的自定义单元格

Self Sizing Cells 使 UITableView 跳跃

Self Sizing Cells使UITableView跳跃