首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是以编程方式创建UITableViewCell还是从nib加载更快?

是以编程方式创建UITableViewCell还是从nib加载更快?
EN

Stack Overflow用户
提问于 2011-12-13 13:24:09
回答 4查看 4.2K关注 0票数 15

Time profiler显示,我的应用程序中最耗时的操作是从nib文件加载UITableViewCells。其中最昂贵的是加载一个包含4KB图像的UITableViewCell

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

代码语言:javascript
复制
    [[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL];
    cell = portraitCell;
    self.portraitCell = nil;

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

编辑:

我比较了从nib加载UITableViewCell和以编程方式创建视图的重复运行的时间分布。我的测试包括在3-5秒的时间内在两个UITableViews之间交替大约10次。在每次测试中,以编程方式加载UITableViewCell的速度都要快很多,大约快2到6倍。

有人能证实这些结果吗?

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

代码语言:javascript
复制
    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更快。从nib加载UITableViewCells的平均运行时间约为90ms,而以编程方式创建UITableViewCell的平均运行时间为50ms。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-13 14:39:29

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

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

票数 13
EN

Stack Overflow用户

发布于 2011-12-14 03:32:07

在WWDC2011视频中提到的iOS 5中,有一种使用UINib的较新方法。在viewDidLoad:方法中注册nib,然后在tableView:cellForRowAtIndexPath:方法中简化代码。这可能会加快你的速度(但我从来没有执行过任何比较计时)。

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

代码语言:javascript
复制
NSString *myIdentifier = @"ReusableCustomCell";
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier];

在您的tableView:cellForRowAtIndexPath:方法中,只需请求单元格(不需要检查nil,因为可以保证返回iOS5下的单元格)并配置该单元格:

代码语言:javascript
复制
- (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更快,我会很感兴趣。

票数 5
EN

Stack Overflow用户

发布于 2011-12-13 15:07:23

我加载nib单元(cellTemplate)一次,并根据需要复制它,因此在某种意义上,这种方法既是编程的,也是基于nib的。

复制比我想象的要复杂得多,因为mutableCopy不能工作。然而,NSKeyedArchiver往返做到了:

代码语言:javascript
复制
NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate];
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData];

事实上,如果你想要的是原始的,惊人的,脚踏板到金属的速度,甚至存档的模板也可以只计算一次并缓存。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8484708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档