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

Eyt*_*tan 15 iphone cocoa-touch uikit ios

时间分析器显示我的应用程序中最耗时的操作是UITableViewCells从nib文件加载.其中最昂贵的是加载UITableViewCell4KB图像.

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

    [[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL];
    cell = portraitCell;
    self.portraitCell = nil;
Run Code Online (Sandbox Code Playgroud)

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

编辑:
我比较了UITableViewCell从笔尖重复加载和以编程方式创建视图的时间曲线.我的测试包括UITableViews在3-5秒的时间内交替两次约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;
Run Code Online (Sandbox Code Playgroud)

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

rob*_*off 13

尝试创建一次UINib对象,然后在instantiateWithOwner:options:每次需要创建新单元格时发送它.从UINib类参考:

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


Rob*_*Cat 5

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

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

NSString *myIdentifier = @"ReusableCustomCell";
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier];
Run Code Online (Sandbox Code Playgroud)

在你的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;
}
Run Code Online (Sandbox Code Playgroud)

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