0
-(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;
}
4

2 回答 2

2

通常你会想从表格中获取一个单元格,就像你在第一个代码中所做的那样。但在这种情况下,你不能。如果你尝试,你最终会在 and 之间进行递归cellForRowAtIndexPath调用heightForRowAtIndexPath

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

于 2012-12-04T03:54:17.837 回答
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;
    }
}
于 2012-12-04T04:07:20.743 回答