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;