码迷,mamicode.com
首页 > 其他好文 > 详细

tableView循环引用以及缓存池中的两个常见Bug

时间:2015-12-25 13:12:24      阅读:427      评论:0      收藏:0      [点我收藏+]

标签:

一、直接看Bug:unable to dequeue a cell with identifier cell_id - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

二、使用tableView的cell重用机制后cell中不显示detailTextLabel。

 *

 *  本文中大量涉及tableView的重新引用机制

 *  在tableView上下滑动的时候会自动销毁不在屏幕显示的tableViewCell,并且同时创建新的tableViewCell来加载新的数据,在创建一个新的cell和销毁一个滑出屏幕的cell时,会消耗手机中大量的内存资源,所以苹果公司在6.0发布后引用了一个新的方法,dequeue reusable!方法名称的意思为:可以重新引用的,源文件代码如下:

 *   - (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); // newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered

 *  在cell被新建的时候,使用次方法系统会自动在“缓存池”中寻找匹配,寻找匹配的两个要求,1.唯一标识ID相同,2.cell类型相同

 *  在cell滑出屏幕的时候,cell会被系统自动放入缓存池中,并且绑定唯一标示ID,类型在创建的时候被声明。

 *  在工具栏中的唯一标识如下图

技术分享

 *  Bug就出现在这个地方:

 *  unable to dequeue a cell with identifier cell_id - must register a nib or a class for the identifier or connect a prototype cell in a storyboard

 *  这句话的意思为系统找缓存池中寻找带有相同唯一标识的ID但是类型不明确,或者没有找到相同类型的xib。

 *  由于寻找匹配重新引用“缓存池”中的cell要满足两个条件:唯一标识ID和唯一标识ID对应的类型也要相同,但是苹果提供的次方法只能确定唯一标识,所以要在程序启动的时候viewDidLoad中告诉系统在“缓存池”中寻找cell时候唯一ID对应的类型。

 *  解决bug的方法:

 *  给tableView注册一个cell,并且告诉系统cell的类型样式

 *  在viewDidLoad中声明的代码如下:

 *    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];

 *  2.第二个小问题

 *  使用tableView的cell重用机制后cell中不显示detailTextLabel。

技术分享

 *  如果用UITableViewCell的类创建一个cell,系统默认的cell的样式为UITableViewCellStyleDefault,这种样式不会显示detaiTextLabel,所以要重新构建一个类,重写init方法设置cell的格式为UITableViewCellStyleSubtitle

 *  用自己写的一个类创建的cell的样式为UITableViewCellStyleSubtitle,可以显示detaiTextLabel

 *    [self.tableView registerClass:[ERTableViewCell class] forCellReuseIdentifier:ID];

 *  如果用到了其他样式的cell,可以自定义一个继承于UITableViewCell的类,并且重写init的方法,使其初始化的时候改变系统的默认样式

 *  苹果提供了cell的四种类型:UITableViewCellStyleDefault(系统默认样式)、UITableViewCellStyleValue1、UITableViewCellStyleValue2、UITableViewCellStyleSubtitle

 *  源文件如下

 *      UITableViewCellStyleDefault, // Simple cell with text label and optional image view (behavior of UITableViewCell in iPhoneOS 2.x)

 UITableViewCellStyleValue1, // Left aligned label on left and right aligned label on right with blue text (Used in Settings)

 UITableViewCellStyleValue2, // Right aligned label on left with blue text and left aligned label on right (Used in Phone/Contacts)

 UITableViewCellStyleSubtitle // Left aligned label on top and left aligned label on bottom with gray text (Used in iPod).

 

 *  小小案例还有两个值得注意的点:

 *  1.

   //用static修饰ID是让ID一直保存在静态区域,当不引用的时候ID也不会被销毁,保证了唯一标识ID在程序运行时候的ID的地址和值的稳定性

   //而@"cell_id"是保存在堆区的

   static NSString * ID = @"cell_id";

    2.

  //用__weak修饰weakAlertCountroller是为了在下文中经过block引用后copy变成强引用,避免循环引用,在开发中block引用外部的对象时通常创建一个被__weak修饰的临时对象,在block中调用临时对象

   __weak typeof(alertCountroller) weakAlertCountroller = alertCountroller;

源代码传送门:http://pan.baidu.com/s/1gexiydl

 */

 

tableView循环引用以及缓存池中的两个常见Bug

标签:

原文地址:http://www.cnblogs.com/Erma-king/p/5075458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!