ios - 使用 dequeueReusableCellWithIdentifier 不会显得更快(或更低的内存)?

标签 ios objective-c cocoa-touch uitableview

当我想创建一个带有自定义单元格的表格时,这就是我编写标准代码的方式:

- (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%
  • 滚动流畅

两个问题:

  1. 为什么我在方法 #2 上没有看到更低的 CPU 和内存使用率,是不是方法 #1 错误而方法 #2 正确,因为方法 #1 根本没有重用任何单元格?或者换个角度看,为什么方法一傻傻地一遍又一遍地加载nib,但还是滚动的这么好?

  2. 为自定义单元格创建自定义 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/

相关文章:

iphone - fetchedResultsController 使用谓词获取实体的最佳实践

objective-c - 如何在断点处查看Objective-c(等效汇编代码)?

swift - 是否可以在 Swift iOS 应用程序中设置所有字体的字体大小?

iphone - 在 ios 键盘上方显示建议工具栏

iphone - 致命的 'section too large, can' t 在 gcc 中编码内存地址(iPhone 应用程序)

ios - 如何快速计算两个日期之间的时间(分钟)?

php - 增加服务器端的角标(Badge)数量

iphone - 什么是差异。 b/w @property(非原子,分配)和@property(非原子,保留)

ios - 当应用程序返回前台时删除任何弹出窗口

iphone - 键盘隐藏之前的通知?