前言
UITableView可以说是iOS开发中最为常用、最为重要的一个控件,相信每个iOS开发者对他都不会陌生,但是你真正了解它的工作原理了吗?下面让我们来了解下UITableView的重用机制。
为什么要用重用机制
众所周知,UITableView是可以滚动的一个控件,当UITableView回滚时,如果不用重用机制会重复初始化原来已初始化的cell,所以用重用机制会节省性能,避免出现一些因为网络因素而造成的卡顿现象。
UITableView重用机制的原理
重用机制主要用到了一个可变数组visiableCells
和一个可变的字典类型reusableTableCells
,其中visiableCells
用来存储当前UITableView显示的cell,reusableTableCells
用来存储已经用'identify'缓存的cell。当UITableView滚动的时候,会先在reusableTableCells
中根据identify
找是否有有已经缓存的cell,如果有直接用,没有再去初始化。
UITableView重用的几种写法
1
static NSString *cellID = @"cell";
//根据identify在缓存的字典中找是否有已经初始化好的cell
UITableView *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[HORTransitReportCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellID];
}
return cell;
2 注册的方式
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier: identifier] ;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 重用队列中取单元格 由于上面已经注册过单元格,系统会帮我们做判断,不用再次手动判断单元格是否存在
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: identifier forIndexPath:indexPath] ;
return cell ;
}
这种方式的原理和前一种类似,先注册一个类(也就是告诉编译器这个类可能是我们即将要用来初始化的类)然后根据identify去缓存字典中找是否有这个cell,如果没有的话判断初始化类和注册类符不符合,如果相符就初始化一个新的cell.
特殊情况
有的时候我们会遇到每个cell都大致相同,但是又有细微变化,会让每个cell都单独一个而不互相复用,这时候我们可以指定每个cell的identify
这样就不会变了。
static NSString *cellID = [NSString format@"cell%ld%ld",indexPath.section,indexPath.row];
//根据identify在缓存的字典中找是否有已经初始化好的cell
UITableView *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[HORTransitReportCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellID];
}
return cell;