时间分析器显示我的应用中最耗时的操作是从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毫秒。
答案 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笔尖,然后它们就会离开视图。阅读以下内容: