iOS-tableView的性能优化

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;

10.文字图片可以直接drawInRect绘制;

你可能感兴趣的:(iOS-tableView的性能优化)