对tableView的复用机制原理以及TableViewCell理解

tableview的datasource:cell数据的管理和单元格的复用

tableview的delegate:管理选择,控制hearerview和footerview,删除和重新排序cell等方法

        复用机制:

        UITableView是继承自UIScrollView,其最核心的思想就是UITableViewCell的复用机制。初始化的时候他会先创建cell的缓存字典section的缓存array,以及一个用于存放复用cell的mutableSet(可变的集合)。并且它会去创建显示的(n+1)个cell,其他都是从中取出来重用。

        其中过程是这样的:当有cell滑出屏幕时,会将其放入到一个set中(相当于一个重用池),当UITableView要求返回cell的时候,datasource会先在集合中查找是否有闲置的cell,若有则会将数据配置到这个cell中,并将cell返回给UITabelView。 这大大减少了内存的开销。

        UITableViewCell:

        UITableView每一行都是一个UITableViewCell,UITableViewCell内部有一个默认的自视图ContentView ,其作为父视图,有三个对应的子视图:textLabel、detailTextLabel、UIImageView。而我们需要用UITabelCellStyle属性去决定用哪个子视图(对应属性以及在ContentView中的位置)。其结构图如下:

对tableView的复用机制原理以及TableViewCell理解_第1张图片

        

*为了解决一个UITableView有不同cell的问题,我们会在初始化cell的时候,传入一个特定的“字符串标识”,不同的cell有不同的“字符串标识”(cell id)。当UITableView 要求datasource返回cell的时候,此时就利用reuseIdentifier属性到对象词中查找对应类型的cell对象,若找到就重用,否则利用这个reuseIdentifier属性来实例化一个cell对象。

大概流程:

1.初始化(已缓存的cell,section,基本属性等),其在内部是先用_needReload()标记,然后再调用 SetNeedslayoutSetNeedslayout会在接下来即将到来的runloop周期中调用displayIfNeeded标记,判断返回值是否为yes,是的话就进行drawRect视图重绘,然后在runloop周期中调用layoutSubviews()布局,然后在内部调用reloadData方法,在里面会对每个cell进行removeFromSuperview操作(为了指针悬挂的情况,有可能某个cell被其他视图引用,避免了cell的被引用失效),以及清除cell缓存字典和复用set。接着根据datasource重新布局(包括headerview和footerview的移除,cell的高度等等)。

对tableView的复用机制原理以及TableViewCell理解_第2张图片

 部分图文来源:

iOS小技能:cell的重用原理及自定义cell_51CTO博客_ios 自定义cell

流程学习:

UITableView实践(一):实现原理 - Helloted Blog

你可能感兴趣的:(swift,ios,xcode,objective-c,swift,开发语言)