IOS之UITableView优化-可重用机制

来源:互联网 发布:鞋子淘宝试用报告范文 编辑:程序博客网 时间:2024/04/30 23:36

一、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 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] 创建10次cell,并给cell指定同样的重用标识,并且10个cell全部都加入到 visiableCells数组。

2)向下拖动tableView,当cell1完全移出屏 幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。 cell11加入到visiableCells,cell1移出visiableCells,cell1加入到 reusable-cell queue

3. 接着向下拖动tableView,因为 reusable-cell queue中已经有可用cell对象,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableView dequeueReusableCellWithIdentifier:CellIdentifier,返回cell1。 cell1加入到visiableCells,cell1移出 reusable-cell queue;cell2移出 visiableCells,cell2加入到 reusable-cell queue


4.存在的问题

重取出来的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的使用


0 0