以编程方式创buildUITableViewCell或从笔尖加载UITableViewCell更快吗?

时间剖析器显示最耗时的操作在我的应用程序从nib文件加载UITableViewCells 。 其中最昂贵的包括加载一个4KB图像的UITableViewCell

我使用下面的代码从nib加载UITableViewCell

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

有没有人比较创build一个视图编程或从一个笔尖加载UITableViewCell的区别?

编辑:
我比较了从一个nib加载UITableViewCell重复运行的时间轮廓,并以编程方式创build视图。 我的testing涉及在3-5秒的时间间隔内交替两次UITableViews 10次​​。 在每个testing中,以编程方式加载UITableViewCell速度要快得多,速度要快两倍到六倍。

任何人都可以证实这些结果吗?

编辑:我更新了笔尖加载代码只加载一次笔尖文件,并使用caching版本的后续调用。

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

我还使用自动化工具来创build更一致的运行,结果仍然暗示以编程方式加载UITableViewCells比加载用于笔尖的UITableViewCells更快。 从nib加载UITableViewCells的平均运行时间约为90ms,而以编程方式创buildUITableViewCell的平均运行时间为50ms。

尝试创build一个UINib对象一次,然后发送它instantiateWithOwner:options:每次你需要创build一个新的单元格。 从UINib类参考

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

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

例如:在您的viewDidLoad:注册笔尖并保留对它的引用:

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

在你的tableView:cellForRowAtIndexPath:方法只是要求单元格(无需检查零,因为它是保证返回一个单元格下iOS5),并configuration单元格:

 - (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; } 

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

我加载一次笔尖单元格( cellTemplate )并根据需要复制它,所以从某种意义上说,这种方法既是基于程序devise的, 也是基于笔尖的。

复制比我预期的更复杂,因为mutableCopy不起作用。 不过, NSKeyedArchiver往返的确如此:

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

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

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

可以重新使用一次加载的uitableviewcell笔尖,然后再离开视图。 阅读以下:

iPhone – 什么是重用标识符(UITableViewCell)?