Нечетное поведение высоты UITableView с NSZombieEnabled - PullRequest
0 голосов
/ 22 июля 2010

Я устанавливаю свой рост:

- (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. Не знаете, как решить?

UPDATE: Вот как я строю свою инициализирующую ячейку:

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

Если я удаляю авто-релиз, все работает нормально. Я все еще в замешательстве, почему?

1 Ответ

0 голосов
/ 22 июля 2010

См. Руководство по управлению памятью какао .

Предполагая, что 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...