有什么理由我们不像这样简单地声明cellForRowAtIndexPath:

时间:2012-12-04 03:41:14

标签: objective-c uitableview xcode4.5

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:indexPath];
    return cell.bounds.size.height;
}

有什么不利之处?

我从

改变了
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.bounds.size.height;
}

2 个答案:

答案 0 :(得分:2)

通常,您希望从表中获取一个单元格,就像在第一位代码中那样。但在这种情况下你不能。如果您尝试,最终会在cellForRowAtIndexPathheightForRowAtIndexPath之间进行递归通话。

如果必须从heightForRowAtIndexPath方法获取单元格,则不得向表格询问单元格。

答案 1 :(得分:2)

正如rmaddy指出的那样,你不能使用第一个版本,因为-[UITableView cellForRowAtIndexPath:]会导致表格视图再次向你发送tableView:heightForRowAtIndexPath:,从而导致无限递归。

如果您正在使用一组静态单元格,并且为表格的每一行预分配了一个单元格,那么第二个版本就可以了。

如果要为行动态创建单元格,第二个版本将最终耗尽表格视图的重用队列,然后为每一行创建另一个单元格,因为tableView:cellForRowAtIndexPath:会返回一个自动释放的对象。在运行循环结束之前,这些单元格都不会被释放,因此除了创建和销毁所有这些单元格的时间成本之外,您还使用与表格中的行数成比例的内存。如果你想这样做,并且你有很多行,你可能想要使用一个显式的自动释放池:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    @autoreleasepool {
        UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
        return cell.bounds.size.height;
    }
}