dequeueReusableCellWithIdentifier如何工作?

时间:2011-07-19 09:37:03

标签: iphone ios uitableview

我想对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;
}

2 个答案:

答案 0 :(得分:10)

只有当初始化的单元格移出屏幕时才会发挥作用。

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

这也是为什么在if (cell == nil)条件之外配置单元属性非常重要的原因。

答案 1 :(得分:5)

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

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