代码地址
table的重用机制:
1. 首次加载view会根据屏幕大小和给定的预估高度确定cell的个数,然后预估cell个数添加到重用池中
ViewReuserPool 是继承NSObject的一个类 负责处理重用视图的读取
`
// 向重用池添加一个试图
- (void)addUsingView:(UIView *)view;
- (void)addUsingView:(UIView *)view
{
if (view == nil) {
return;
}
[_usingQueue addObject:view];
}
`
2.当view 刷新数据源的时候将重用池里面的视图 标记为可重用状态
`- (void)reset
{
UIView * view = nil;
while ((view = [_usingQueue anyObject])) {
// 从使用队列移除
[_usingQueue removeObject:view];
// 加入等待队列
[_waiteUsedQueue addObject:view];
}
}
`
3.获取数据源,根据数据源的个数创建对应的cell,当重用池有可重用cell 就取出来,没有就创建新的视图添加到可重用池中
` for (int i = 0; i < [arrayTitles count]; i++) {
NSString * title = arrayTitles[i];
// 从重用池 取出一个Button
UIButton * button = (UIButton *)[reuserPool dequeueReuserableView];
if (button == nil) {
button = [[UIButton alloc] initWithFrame:CGRectZero];
button.backgroundColor = [UIColor whiteColor];
// 注册button到重用池中
[reuserPool addUsingView:button];
NSLog(@"创建了一个按钮");
}else
{
NSLog(@"Button 重用了");
}
[containerView addSubview:button]; `