本篇博客目的是:总结UITableView性能优化方向,有些优化方式是我在开发中使用到过的,有些是没有用到过的,当中也有参考、查看很多大神的总结,这才有了本篇博客,仅供大家参考!
1. Cell重用
1.1>数据源方法优化
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
在可见的页面会重复绘制页面,每次刷新显示都会去创建新的Cell,非常耗费性能。
解决方案:首先创建一个静态变量reuseID(代理方法返回Cell会调用很多次,防止重复创建,static保证只会被创建一次,提高性能),然后,从缓存池中取相应identifier的Cell并更新数据,如果没有,才开始alloc新的Cell,并用identifier标识Cell。每个Cell都会注册一个identifier(重用标识符)放入缓存池,当需要调用的时候就直接从缓存池里找对应的id,当不需要时就放入缓存池等待调用。(移出屏幕的Cell才会放入缓存池中,并不会被release)所以在数据源方法中做出如下优化:
// 调用次数太多,static 保证只创建一次reuseID,提高性能
static NSString *reuseID = “reuseCellID”;
// 缓存池中取已经创建的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseID];
1.2>缓存池的实现
当Cell要alloc时,UITableView会在堆中开辟一段内存以供Cell缓存之用。Cell的重用通过identifier标识不同类型的Cell,由此可以推断出,缓存池外层可能是一个可变字典,通过key来取出内部的Cell,而缓存池为存储不同高度、不同类型(包含图片、Label等)的Cell,可以推断出缓存池的字典内部可能是一个可变数组,用来存放不同类型的Cell,缓存池中只会保存已经被移出屏幕的不同类型的Cell。
1.3>缓存池获取可重用Cell两个方法的区别
-(nullable __kindof