一、UITableViewCell的可重用机制
目的:为了做到显示和数据分离, 通过重用单元格来达到节省内存的目的
1.使用可重用机制创建cell(系统)
1)定义可重用标识
2)从可重用队列中取出cell
3)若队列中无可用cell,利用alloc,init新建cell
static NSString *reuseIndentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIndentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIndentifier];
}</span>
ps:记得要在设置控件的Indentifier属性为MyCell
2.原理
在UITableView的头文件中有visibleCells,存放当前显示的的cells
@property (nonatomic,readonly)NSArray<__kindofUITableViewCell *> *visibleCells;
当需要更新显示数据时,dequeueReusableCellWithIdentifier会先在可重用cell队列 reusable-cell queue中返回一个cell对象,若不存在,则返回nil;
3.举例
若一共有50条数据,屏幕最多显示10个cell。
1)由于初始时 reusable-cell queue为空,所以用 [[UITableViewCell
2)向下拖动tableView,当cell1完全移出屏 幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。 cell11加入到visiableCells,cell1移出visiableCells,cell1加入到 reusable-cell queue。
3. 接着向下拖动tableView,因为 reusable-cell queue中已经有可用cell对象,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableView
重取出来的cell是有可能已经捆绑过数据或者加过子视图的,造成视图叠加混乱的现象
解决:
1)删除已有数据或子视图
2)放弃了重用机制,每次根据indexPath获取对应的cell返回。
将方法: UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIndentifier];
替换为: UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
5.自定义cell的可重用机制使用
1)在nib中加载MyCell这个类
2)注册自定义的cell 的可重用标识
UINib *nib = [UINib nibWithNibName:@"MyCell" bundle:nil];
[tableView registerNib:nib forCellReuseIdentifier:reuseIdentity];用标识,并加入缓存池
3)同上系统cell的使用