Time profiler显示,我的应用程序中最耗时的操作是从nib文件加载UITableViewCells。其中最昂贵的是加载一个包含4KB图像的UITableViewCell。
我使用以下代码从nib加载UITableViewCell:
[[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文件一次,并使用缓存版本进行后续调用。
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。
发布于 2011-12-13 14:39:29
尝试创建一个UINib对象,然后在每次需要创建新单元格时发送instantiateWithOwner:options:。从
例如,如果您的表格视图使用nib文件来实例化表格视图单元格,则在
UINib对象中缓存nib可以显著提高性能。
发布于 2011-12-14 03:32:07
在WWDC2011视频中提到的iOS 5中,有一种使用UINib的较新方法。在viewDidLoad:方法中注册nib,然后在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更快,我会很感兴趣。
发布于 2011-12-13 15:07:23
我加载nib单元(cellTemplate)一次,并根据需要复制它,因此在某种意义上,这种方法既是编程的,也是基于nib的。
复制比我想象的要复杂得多,因为mutableCopy不能工作。然而,NSKeyedArchiver往返做到了:
NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate];
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData];事实上,如果你想要的是原始的,惊人的,脚踏板到金属的速度,甚至存档的模板也可以只计算一次并缓存。
但是你不是应该测量帧速率吗?在这种情况下,UIView的复杂性也会发挥作用。
https://stackoverflow.com/questions/8484708
复制相似问题