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繪制;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容