UITableView中的cell重用(原理)以及cell重用解决办法
来源:互联网 发布:手机淘宝怎么发布零食 编辑:程序博客网 时间:2024/05/21 04:44
一、cell重用原理对于UITableView中系统的cell,一般会通过重用cell来达到节省内存的目的:通过为每个cell指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,当cell滚出屏幕时,会将滚出屏幕的单元格放入重用的queue中,当某个未在屏幕上的单元格要显示的时候,就从这个queue中取出单元格进行重用。 即调用dequeueReusableCellWithIdentifier方法来实现。代码如下:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *cellIdentifier = [NSString stringWithFormat:@"cell"]; UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefaultcellIdentifier] autorelease]; } return cell;}例如:一个table中有20个cell,但是屏幕上最多只能显示10个cell,那么在实际上系统只为其分配了10个cell的内存。当滚动屏幕时,屏幕内显示的cell重复使用这10个cell的内存。之前有参考过一些资料,解释:在UITableView的头文件中,会找到NSMutableArray *visiableCells,和NSMutableDictionary *reusableTableCells两个结构。visiableCells保存当前显示的cells,reusableTableCells保存可重用的cells。TableView显示之初,reusableTableCells为空,那么dequeueReusableCellWithIdentifier方法返回nil。开始的10个cell都会走 if(cell == nil) 判断(这里可打断点调试) 通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]来创建,并给cell指定同样的重用标识,10个cell全部都加入到visiableCells数组,reusableTableCells为空。向下拖动tableView,当cell1完全移出屏幕,且cell11完全显示在屏幕上时,cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。之后的cell都是如此。也许这是比较古老的tableView的头文件,现在搜了一下,貌似找不到这两个容器。二、cell重用解决办法对于一些自定义的cell,使用重用机智就会导致出错,因此给出以下两种解决重用机制的方法:1、通过调用cellForRowAtIndexPath方法根据indexPath准确地取出一行- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"cell"; // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; //改为以下的方法 UITableViewCell *cell =[tableView cellForRowAtIndexPath:indexPath]; //根据indexPath准确地取出一行,而不是从cell重用队列中取出 if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } return cell; } 2、为每个cell指定不同的重用标识符(reuseIdentifier)- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellIdentifier =[NSString stringWithFormat:@"cell%d%d", [indexPath section], [indexPath row]];//以indexPath来唯一确定cell UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; //出列可重用的cell if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } return cell; }
8 0
- UITableView中的cell重用(原理)以及cell重用解决办法
- UITableView cell的重用
- UITableView中的cell重用正确,但是重影
- cell 重用解决办法
- tableView重用cell原理
- tableView重用cell原理
- tableView重用cell原理
- tableView重用cell原理
- tableView重用cell原理
- Cell的重用原理
- Cell的重用原理
- cell的重用原理
- cell 重用
- cell重用
- cell重用,少量cell的解决办法
- iOS中UITableView学习笔记(二)之cell重用
- 解决UITableView中cell重用机制
- UITableview 多选 解决cell重用问题
- 队列与优先队列
- hdu1402A * B Problem Plus
- JVM详细工作机制
- Eclipse 软件设置相关
- C++内联函数和constexpr函数
- UITableView中的cell重用(原理)以及cell重用解决办法
- Tkinter -- Grid布局
- python+webdriver+autoit实现百度云盘文件上传
- 海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
- POJ 2139——Six Degrees of Cowvin Bacon 最短路径
- LIBSVM的结构分析
- VB与flash交互
- 求n的阶乘以及前n个数的阶乘和
- apache-tomcat-8.0.32 + jdk1.8.0_65 的环境配置