以编程方式创建UITableViewCell或从笔尖加载一个是否更快?

时间:2011-12-13 05:24:09

标签: iphone ios cocoa-touch uikit

时间分析器显示我的应用中最耗时的操作是从nib文件加载UITableViewCells。其中最昂贵的是将UITableViewCell与4KB图像一起加载。

我使用以下代码从nib加载UITableViewCell

    [[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL];
    cell = portraitCell;
    self.portraitCell = nil;

有没有人比较过以编程方式创建视图或从笔尖加载UITableViewCell之间的区别?

编辑:
我比较了从笔尖重复加载UITableViewCell并以编程方式创建视图的时间曲线。我的测试包括在3-5秒的时间内在两个UITableViews之间交替进行约10次。在每个测试中,以编程方式加载UITableViewCell要快得多,速度提高2到6倍。

有人可以证实这些结果吗?

编辑: 我更新了nib加载代码,只加载了一次nib文件,并使用缓存版本进行后续调用。

    if (self.UITableViewPortaitNib == nil) {
        self.UITableViewPortaitNib = [UINib nibWithNibName:@"UITableViewCellPortrait" bundle:[NSBundle mainBundle]];
    }

    self.UITableViewPortaitNib instantiateWithOwner:self options:NULL];
    cell = portraitCell;
    self.portraitCell = nil;

我还使用了自动化工具来创建更一致的运行,结果仍然建议以编程方式加载UITableViewCells比加载nib的UITableViewCells更快。从笔尖加载UITableViewCells的平均运行时间约为90毫秒,而以编程方式创建UITableViewCell的平均运行时间为50毫秒。

4 个答案:

答案 0 :(得分:13)

尝试创建一次UINib对象,然后在每次需要创建新单元格时发送instantiateWithOwner:options:。来自UINib Class Reference

  

例如,如果表视图使用nib文件来实例化表视图单元格,则在UINib对象中缓存nib可以显着提高性能。

答案 1 :(得分:5)

在iOS 5中并在WWDC 2011视频中提到过,有一种使用UINib的新方法。您可以在viewDidLoad:方法中注册您的笔尖,然后使用tableView:cellForRowAtIndexPath:方法简化代码。这可能会为你加快速度(但我从未进行任何比较时间)。

实施例: 在viewDidLoad:注册nib并保留对它的引用:

NSString *myIdentifier = @"ReusableCustomCell";
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier];

在你的tableView:cellForRowAtIndexPath:方法中,只需要求单元格(无需检查nil,因为它可以保证在iOS5下返回一个单元格)并配置单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *myIdentifier = @"ReusableCustomCell";

    ReusableCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];
    // Your configuration code goes here
    cell.nameLabel.text = @"some text";
    // ....

    return cell;
}

代码未经测试。如果这比单独使用UINib更快,我会感兴趣。

答案 2 :(得分:2)

我加载了nib单元格(cellTemplate)并根据需要复制它,所以从某种意义上说,这种方法是基于编程的 nib。

由于mutableCopy不起作用,复制比我预期的要复杂得多。然而,NSKeyedArchiver往返确实如此:

NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate];
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData];

事实上,如果你想要原始的,炽热的,踏板到金属的速度,即使是存档的模板也可以计算一次并缓存。

但你不应该测量帧速率吗?在这种情况下,UIView的复杂性也会发挥作用。

答案 3 :(得分:0)

可以重复使用一次加载的uitableviewcell笔尖,然后它们就会离开视图。阅读以下内容:

iPhone - What are reuseIdentifiers (UITableViewCell)?