iOS开发之cell复用机制

2022-05-23  本文已影响0人  我是卖报的小行家

cell的注册与不注册的情况的区别
如果是注册的情况

[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]

非注册:

[tableView dequeueReusableCellWithIdentifier:@"cell"]

对于这两种方法的解释
注册带forIndexPath:

newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered
更新的出队列方法保证返回一个单元格并正确调整大小(假设已注册标识符)

非注册不带forIndexPath:

Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one
委托用于获取已分配的单元格,而不是分配一个新单元格。

很明显 注册的方法会自动帮我们完成分配新单元格这个工作 而非注册则需要我们自己手动创建新的单元格

总结

所以,注册不注册其实指:【有没有为某一identifier 注册一个Class】 或者理解为:有没有把一个identifier和一个Class相互绑定。 如果发生绑定,当标识符为identifier 的Cell队列中没有可复用的cell时,系统会自动创建一个绑定的Class类型的cell。 如果没有绑定Class,那么我们要手动判定是否无可复用的cell,并手动新建一个cell。 一句话总结:注册后就不用管cell是否需要新建了。 所以各有各的好,如果样式单一,使用注册就可以很方便的解决的话,注册就可以达到效果。不过如果想要查询是否复用,或者详细的复用方面的问题,判空,可以查看是否重新建立了,来判断更加细致,不注册可能会更好。但大部分情况我们都使用注册的情况。具体使用还是应该分情况而定。

通常情况下理解的概念:
通俗地说一下。假设我们的tableview中有10个cell,窗口只容得下前4个,每个cell都是一样的,复用id也一样。从初始位置开始慢镜头,把cell前上滑动一点点,此时第一个cell的一部分消失了,第五个cell露出了一部分,这时第一个cell并没有进入到复用池,池子是空的,第五个cell自然也就不能在复用池中找到可复用的cell,第五个cell执行了如下代码:(先假定我们使用不注册的方法通过判空来详细了解复用池)

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cacheCellId];
if (!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}

复制代码
所以一个cell创建时候会先走if里面的
当第五个cell完全显示出来,第一个cell也已经完全退出了窗口,这时第一个cell被放入到复用池。我们继续向上滑动,第六个cell将显示出来,它也要走上面的那段代码,但是它不会进入到if里面去,因为第一个cell已经在复用池中了,第六个cell可以复用第一个cell,而不需重新创建对象。
这就是tableView的复用

原文链接:https://juejin.cn/post/6966851268887183390

上一篇下一篇

猜你喜欢

热点阅读