这是自定义cell的UI代码,用masonry进行布局约束。计算出了cell加载前和加载后的时间差且打印。下面来看下打印信息:性能优化
第 0 行cell加载消耗 0.012509 秒
第 1 行cell加载消耗 0.001275 秒
第 2 行cell加载消耗 0.000981 秒
第 3 行cell加载消耗 0.000905 秒
第 4 行cell加载消耗 0.000892 秒
第 5 行cell加载消耗 0.000891 秒
第 6 行cell加载消耗 0.000888 秒
第 7 行cell加载消耗 0.000903 秒
第 8 行cell加载消耗 0.000895 秒
第 9 行cell加载消耗 0.000888 秒布局
打印信息能够看出加载这种简单样式cell时间消耗仍是挺快的,平均0.00几秒。那么咱们来看下cell绘制的方式来展示界面视图的方式效果如何。下面是重写celldrawRect方法,把cell中的三部分进行绘制:性能
- (void)drawRect:(CGRect)rect { // 头像 CGRect imageViewRect = CGRectMake(15, 15, 30, 30); UIImage *iconImage = [UIImage imageNamed:@"images"]; [iconImage drawInRect:imageViewRect]; // 姓名 CGFloat fontSize = 16; NSString *name = @"大白"; CGFloat width = rect.size.width - 60; UIFont *nameFont = [UIFont boldSystemFontOfSize:fontSize]; NSDictionary *attrs = @{NSFontAttributeName : nameFont}; [name drawInRect:CGRectMake(60, 8, width, 20) withAttributes:attrs]; // 内容 NSString *content = @"这是大白想说的话"; [content drawInRect:CGRectMake(60, 35, width, 20) withAttributes:attrs];
}优化
达到一样的效果来看下运行时间打印:spa
2018-08-25 11:50:56.985876+0800 列表性能优化方案[1549:82858] 第 0 行cell加载消耗 0.000415 秒
2018-08-25 11:50:56.991175+0800 列表性能优化方案[1549:82858] 第 1 行cell加载消耗 0.000167 秒
2018-08-25 11:50:56.991874+0800 列表性能优化方案[1549:82858] 第 2 行cell加载消耗 0.000066 秒
2018-08-25 11:50:56.992405+0800 列表性能优化方案[1549:82858] 第 3 行cell加载消耗 0.000066 秒
2018-08-25 11:50:56.992927+0800 列表性能优化方案[1549:82858] 第 4 行cell加载消耗 0.000065 秒
2018-08-25 11:50:56.993470+0800 列表性能优化方案[1549:82858] 第 5 行cell加载消耗 0.000086 秒
2018-08-25 11:50:56.994018+0800 列表性能优化方案[1549:82858] 第 6 行cell加载消耗 0.000084 秒
2018-08-25 11:50:56.994520+0800 列表性能优化方案[1549:82858] 第 7 行cell加载消耗 0.000062 秒
2018-08-25 11:50:56.995033+0800 列表性能优化方案[1549:82858] 第 8 行cell加载消耗 0.000068 秒
2018-08-25 11:50:56.995558+0800 列表性能优化方案[1549:82858] 第 9 行cell加载消耗 0.000080 秒3d
能够看出,用绘制方式要比通常的自定义视图方式平均快了两个小数点级别。并且这仍是在drawRect方法内容代码没有进行任何优化的状况下、这只是简单的cell元素个数比较少的状况下。若是遇见复杂视图的话,这种对比应该更明显。code
从代码维护角度来看,代码会比较难维护,可是一旦界面稳定下来的状况下就能够用绘制方式代替复合视图。blog