dequeueReusableCellWithIdentifier如何工作?

我想要一些关于dequeueReusableCellWithIdentifier:kCellIdentifier精确度dequeueReusableCellWithIdentifier:kCellIdentifier 。 如果我理解的很好,下面的NSLOG应该只打印一次。 但事实并非如此。 那么dequeueReusableCell有什么意义呢? 它是只有自定义单元格有效吗?

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *kCellIdentifier = @"UITableViewCellStyleSubtitle3"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier]; if (cell == nil) { NSLog(@"creation of the cell"); cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellIdentifier] autorelease]; } cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; cell.textLabel.text = [[self.table objectAtIndex:indexPath.row] objectForKey:kTitleKey]; [cell setBackgroundColor:[UIColor colorWithWhite:1 alpha:0.6]]; return cell; } 

开始滚动你的tableview,你应该看到日志消息不再出现。

如果您有一个高度为1000像素的桌面视图,并且每个单元格的高度为100像素,则会看到11次日志消息。
因为11是同时可见的单元格的最大数量。
它是11而不是10,因为当你向下滚动一点时,将会有9个完全可见的单元格和2个只能部分可见的单元格。

它只在初始化的单元格离开屏幕时才起作用。

例如,假设你有一个表格视图,在屏幕上显示十个单元格,但总共有一百行。 当视图第一次加载并填充表视图时,十个单元格将被初始化( 因此多个 NSLog 语句 )。 当您开始向下滚动时,从屏幕顶部消失的单元格被放置到重用队列中。 当需要绘制从底部出现的新单元时,它们将从重用队列中出列,而不是初始化新实例,从而减less内存使用量。

这也是为什么在if (cell == nil)条件之外configuration你的单元的属性是很重要的。