iOS-tableView的性能優(yōu)化

1.tableViewCell復(fù)用機(jī)制

簡單介紹:
假設(shè)我們的tableview中有1000個(gè)cell,窗口只容得下前5個(gè),每個(gè)cell都是一樣的,復(fù)用id也一樣。從初始位置開始慢鏡頭,把cell前上滑動(dòng)一點(diǎn)點(diǎn),此時(shí)第一個(gè)cell的一部分消失了,第六個(gè)cell露出了一部分,這時(shí)第一個(gè)cell并沒有進(jìn)入到復(fù)用池,池子是空的,第六個(gè)cell自然也就不能在復(fù)用池中找到可復(fù)用的cell,第6個(gè)cell執(zhí)行了如下代碼:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cacheCellId];  
if (!cell) {  
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];  
} 

第7個(gè)以后可以從緩存池里面找到了,這樣實(shí)際我們只創(chuàng)建了6個(gè)cell

2.緩存cell高度

假設(shè)我們的tableview中有1000個(gè)cell,每當(dāng)屏幕出現(xiàn)新的cell(無論是新創(chuàng)建的還是從緩存中取得)都會執(zhí)行以下方法

- (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的出現(xiàn)我們就需要計(jì)算cell高度、影響性能

3.滑動(dòng)時(shí)按需加載(這個(gè)在大量圖片展示,網(wǎng)絡(luò)加載的時(shí)候很管用

具體可以參考 VVeboTableViewDemo

4.盡可能重用開銷比較大的對象。

如NSDateFormatter 和 NSCalendar等對象初始化非常慢,我們可以把它加入類的屬性當(dāng)中,或者創(chuàng)建單例來使用

5.離屏渲染會產(chǎn)生性能問題

iOS 9.0 之前UIimageView跟UIButton設(shè)置圓角都會觸發(fā)離屏渲染。
iOS 9.0 之后UIButton設(shè)置圓角會觸發(fā)離屏渲染,而UIImageView里png圖片設(shè)置圓角不會觸發(fā)離屏渲染了,如果設(shè)置其他陰影效果之類的還是會觸發(fā)離屏渲染的。
這可能是蘋果也意識到離屏渲染會產(chǎn)生性能問題,所以能不產(chǎn)生離屏渲染的地方蘋果也就不用離屏渲染了。
iOS設(shè)置圓角的四種方法

6.設(shè)計(jì)統(tǒng)一規(guī)格的Cell,善用hidden隱藏(顯示)subviews

統(tǒng)一Cell的規(guī)格,不僅能減少設(shè)計(jì)不同Cell所需要代碼量,更重要的是能提高Cell的重用率,提升TableView整體性能

7.UITableViewCell 上的子View的opaque屬性設(shè)為YES。

其實(shí)默認(rèn)也是不透明。UITableViewCell盡量不要包含透明的子View。

8.使用局部更新

如果只是更新某組的話,使用reloadSection進(jìn)行局部更新

9.開啟光柵化、緩存渲染、避免多次做顏色混合(blending)處理

cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;

10.文字圖片可以直接drawInRect繪制;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容