-(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;
}
答案 0 :(得分:2)
通常,您希望从表中获取一个单元格,就像在第一位代码中那样。但在这种情况下你不能。如果您尝试,最终会在cellForRowAtIndexPath
和heightForRowAtIndexPath
之间进行递归通话。
如果必须从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;
}
}