使用NSZombieEnabled的奇怪的UITableView高度行为

时间:2010-07-22 15:15:36

标签: iphone objective-c cocoa-touch uitableview memory-management

我正在设定我的身高:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    CGFloat rowHeight = 0;

    if(indexPath.row == [self.items count]){ //more
        rowHeight = 50.0; //same as moreCell 
    }
    else{
        ChartlyCell *cell = (ChartlyCell*)[self tableView:tblView cellForRowAtIndexPath:indexPath];
        rowHeight = cell.totalHeight;
    }

    return rowHeight;   
}

以下是cell.totalHeight的计算方法:

-(float)totalHeight {
    float h = messageLabel.totalheight + 35;
    if(h < 68) h = 68;
    return h;
}

NSZombieEnabled = NO时,我的模拟器崩溃而没有调试错误。模拟器在NSZombieEnabled = YES时运行正常。不确定如何解决?

更新 这就是我构建初始化单元格的方法:

cell = [[[ChartlyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier andDelegate:self andChartlyDelegate:self andChartlyObj:myChartlyObject]autorelease];

如果我删除自动释放,一切运行正常。我仍然困惑为什么?

1 个答案:

答案 0 :(得分:0)

请参阅Cocoa Memory Management Guide

假设cell是实例变量,请考虑:

cell = [[[ChartlyCell alloc] initWithStyle:UITableViewCellStyleDefault
                           reuseIdentifier:CellIdentifier
                               andDelegate:self
                        andChartlyDelegate:self
                             andChartlyObj:myChartlyObject]autorelease];

当池耗尽时,这将导致cell被收集,从而使cell指向现已解除分配的ChartlyCell实例。如果你想要一个物体附着,它必须保留。保留由alloc隐含,并由autorelease有效撤消。删除autorelease会保留对象。

模拟器应该在启用僵尸的情况下解决错误。奇怪的是它没有。通过http://bugreport.apple.com/提交错误并附上应用程序崩溃版本的内置副本以及此SO问题的链接。