当我想创建一个带有自定义单元格的表格时,这就是我编写标准代码的方式:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"CustomCell";
CustomCell *cell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil)
{
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
cell = [topLevelObjects objectAtIndex:0];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
else
{
NSLog(@"reuse!");
}
cell.property1 = ....
cell.property2 = ....
return cell;
}
这就是我创建自定义单元格的大致方式:
- 创建一个 CustomCell.h(继承 UITableViewCell)和 CustomCell.m 以及一个 CustomCell.xib
- 在 CustomCell.xib 中,将顶层 UIView 的“class”属性更改为“CustomClass”
我已经这样做了一段时间,但今天我终于决定做一个测试,看看表格是否真的正确地重用了单元格。
不。该表未重复使用任何单元格!上面代码片段中的 NSLog(@"reuse!") 永远不会被触发。
我决定使用以下两种方法对具有 100 万个单元格的 TableView 进行性能比较:
方法 #1 使用了上述方法。请注意,UIView 是我的 CustomCell.xib 中的顶级 View ,并且没有在 xib 上配置重用标识符
- cell not reused (NSLog reused! not printed)
- 峰值内存约 3.4MB,峰值 CPU 60%
- 滚动流畅
方法 #2 在 xib 的顶层使用一个 UITableViewCell,我将所有控件放在这个 UITableViewCell 的内容 View 上。在 XIB 中,我将此单元格的重用标识符配置为“CustomCell”。
- cell 重用(NSLog 重用打印多次)
- 峰值内存约 6.1MB,峰值 CPU 约 88%
- 滚动流畅
两个问题:
为什么我在方法 #2 上没有看到更低的 CPU 和内存使用率,是不是方法 #1 错误而方法 #2 正确,因为方法 #1 根本没有重用任何单元格?或者换个角度看,为什么方法一傻傻地一遍又一遍地加载nib,但还是滚动的这么好?
为自定义单元格创建自定义 xib 时,顶级对象是 UIView 还是 UITableViewCell 有什么区别吗? (好像没什么区别?)
最佳答案
似乎 reuseIdentifier
在您的 XIB 文件中设置不正确。
您也可以通过添加以编程方式设置它
[yourTable registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"CustomCell"];
在使用 TableView 之前的某个地方。例如在 viewDidLoad
中。
更新
问题一、如果不设置cell reuse identifier cells life circle如下:
1.创建。
2.显示出来了
3.移出可见区域
4.不需要了,删掉
如果您使用重用标识符单元格,典型的生命周期是:
1.从可重用队列中弹出..
2.显示出来了
3.移出可见区域
4.推送到可重用队列。
所以性能差异是由于执行速度更快:创建/释放操作或弹出/推送操作。两种变体的内存使用量应该大致相同。
关于ios - 使用 dequeueReusableCellWithIdentifier 不会显得更快(或更低的内存)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22102680/