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;