UITableView性能优化
IOS默认会使用懒加载的方式创建cell,但是如果数据量大的话,会抢占较多的内存,尤其是返回之前的数据,IOS是默认重新请求的。
- 个人建议,如果数据量不是很大的话,就用上面的方式就可以了,直接用模型装起来,用的时候直接拿,比较方便。
- 如果数据量大,再通过通过缓存池的方式来创建
缓存池
顾名思义,就是放缓存的地方,你加载过的数据,都放在这里
缓存池的好处也是明显的,就是节约内存,这也是我们最最需要优化的地方。
话不多说,开始上代码。
缓存池请求方式
其他的仍然不变,关键代码还是在cell中
/** 一般写法 */
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
//覆盖数据
Hero *hero = self.heroes[indexPath.row];
cell.textLabel.text = hero.name;
cell.imageView.image = [UIImage imageNamed:hero.icon];
cell.detailTextLabel.text = hero.intro;
/** 性能优化的写法 */
//定义标识符
static NSString *ID = @"hero";
//缓存池查找数据
UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:ID];
//判空,如果没有就根据id初始化
if(cell == nil){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
//覆盖数据
Hero *hero = self.heroes[indexPath.row];
cell.textLabel.text = hero.name;
cell.imageView.image = [UIImage imageNamed:hero.icon];
cell.detailTextLabel.text = hero.intro;
/**
* 注册的写法
* 可节省判空操作
*/
//定义标识符
NSString *ID = @"hero";
- (void)viewDidLoad {
[super viewDidLoad];
//注册标识符对应的cell类型
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}
如此,整体性能便提升了。
最后,还有个更简单的用法:
StoryBorad方式
*StoryBorad中,可以直接设置identifier*
在storyborad的属性检查选项中,可以直接设置identifier。
代码嘛,能省则省!
步骤
- 在storyborad中设置cell的标识
- 在代码中利用设置的标识读取cell
注意点
- cell里面还有个View,是contentView,如果要添家内容的话,IOS官方的建议是:添加到ContentView中
- 如果你在storyBorad中添加的话,系统会默认添加到contentView中
- storyBorad中也可以在添加多个cell