1.tableViewCell复用机制
简单介绍:
假设我们的tableview中有1000个cell,窗口只容得下前5个,每个cell都是一样的,复用id也一样。从初始位置开始慢镜头,把cell前上滑动一点点,此时第一个cell的一部分消失了,第六个cell露出了一部分,这时第一个cell并没有进入到复用池,池子是空的,第六个cell自然也就不能在复用池中找到可复用的cell,第6个cell执行了如下代码:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cacheCellId];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}
第7个以后可以从缓存池里面找到了,这样实际我们只创建了6
个cell
2.缓存cell高度
假设我们的tableview中有1000个cell,每当屏幕出现新的cell(无论是新创建的还是从缓存中取得)都会执行以下方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%s", __FUNCTION__);
UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:@"UITableViewCell" forIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%ld-%@",(long)indexPath.row,_dataArray[indexPath.row]]
;
cell.backgroundColor = [UIColor yellowColor];
return cell;
}
#pragma mark- UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%s%@", __FUNCTION__,indexPath);
return 50;
}
如果我们不缓存cell高度、也就会说每次有新的cell的出现我们就需要计算cell高度、影响性能
3.滑动时按需加载(这个在大量图片展示,网络加载的时候很管用
)
具体可以参考 VVeboTableViewDemo 。
4.尽可能重用开销比较大的对象。
如NSDateFormatter 和 NSCalendar等对象初始化非常慢,我们可以把它加入类的属性当中,或者创建单例来使用
5.离屏渲染会产生性能问题
iOS 9.0 之前UIimageView跟UIButton设置圆角都会触发离屏渲染。
iOS 9.0 之后UIButton设置圆角会触发离屏渲染,而UIImageView里png图片设置圆角不会触发离屏渲染了,如果设置其他阴影效果之类的还是会触发离屏渲染的。
这可能是苹果也意识到离屏渲染会产生性能问题,所以能不产生离屏渲染的地方苹果也就不用离屏渲染了。
iOS设置圆角的四种方法
6.设计统一规格的Cell,善用hidden隐藏(显示)subviews
统一Cell的规格,不仅能减少设计不同Cell所需要代码量,更重要的是能提高Cell的重用率
,提升TableView整体性能
7.UITableViewCell 上的子View的opaque属性设为YES。
其实默认也是不透明。UITableViewCell尽量不要包含透明的子View。
8.使用局部更新
如果只是更新某组的话,使用reloadSection进行局部更新
9.开启光栅化、缓存渲染、避免多次做颜色混合(blending)处理
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;