iphone - UITableView出队ReusableCellWithIdentifier理论

标签 iphone uitableview reuseidentifier

当苹果为第一代 iPhone 开发 UITableView 时,他们在滚动时遇到了性能问题。然后一位聪明的工程师发现造成这种情况的原因是对象的分配是有代价的,所以他想出了一种重用cell的方法。

"Object allocation has a performance cost, especially if the allocation has to happen repeatedly over a short period—say, when the user scrolls a table view. If you reuse cells instead of allocating new ones, you greatly enhance table-view performance."

Source: iOS Reference Library

要重复使用您使用的单元格:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

现在,我想知道的是,这里到底发生了什么?如果存在具有该标识符的单元格,它是否会在 TableView 中查找并返回该单元格?嗯,是的,但是如果它发送一个引用而不是分配,并且我有一个 TableView ,假设 4 个具有相同标识符的单元格全部可见。它如何在不分配的情况下将自身相乘为四个实例?

我想知道这一点,因为我正在构建一个日历类型组件,并且所有单元格都具有相同的结构,只有其中的文本发生变化。因此,如果我能以某种方式重用我的单元而不是分配,我想我可能会获得更好的性能。

我自己的理论是它分配了四个单元(只是因为它也分配了)。当单元格从屏幕上消失时,它将被放入 TableView 重用队列中。当需要新单元格时,它会在队列中查找是否有具有相同标识符的单元格可用,它会调用该单元格上的 prepareForReuse 方法,并将其自身从队列中删除。

最佳答案

dequeueReusableCellWithIdentifier: 仅返回已标记为可供重用的 cell。这就是为什么在几乎每个 cellForRowAtIndexPath: 方法中,您都会看到类似的内容



UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (nil == cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier];
}

// Do something to cell

return cell;

实际上,将分配足够的行来填充tableview的可见部分(加上一两个以上)。当单元格滚动离开屏幕时,它们会从表格中删除,并标记为可供重用。随着“可用单元”队列的增长,请求出队单元的行将开始获取要使用的单元,此时您将不再需要分配.

关于iphone - UITableView出队ReusableCellWithIdentifier理论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3552343/

相关文章:

swift - CoreData 在 Swift 中使用自定义 tableView 单元格

ios - 滚动 UITableView 时单元格数据不正确

iphone - Objective-c:如何检测双击 View ?

受 iPhone UITableView 启发的 Javascript 小部件?

swift - View 加载时自动将焦点设置到 UITableView 的第一个单元格

swift - 代码 : How to find which cell has no reuse identifier

iphone - 从 Nib 加载时,自定义单元永远不会排队?

iphone - -sizeWithFont 在设备上的功能不同

javascript - 如何让 jQuery UI 的 Draggable 和 Sortable 功能在 iPhone 上运行?

iphone - iOS - UITableView 非静态背景图片