Почему этот код вызывает пул автоматического выпуска?

Я вижу следующий журнал...

"__NSAutoreleaseNoPool (): объект 0x58264b0 класса UITableViewCellContentView автоматически освобожден без пула на месте - только утечка"

Это огромный журнал пула релизов, выше - только один из журнала релизов, который я скопировал...

У меня есть CustomCell, который добавляет плитки в себя в зависимости от бизнес-логики. Но проблема в том, что когда я вызываю создание ячейки, я вижу вышеупомянутые сообщения журнала. Я не вижу ничего плохого в моем коде.. Кто-нибудь имеет какое-либо представление об этом?

- (UITableViewCell *) tableView:(UITableView *)inTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    UnSavedNoteListCell *cell;
    NSString *CellIdentifier = [@"Cell_" stringByAppendingString:[NSString stringWithFormat:@"%d", indexPath.row]];
     cell = (UnSavedNoteListCell *)[inTableView  dequeueReusableCellWithIdentifier:CellIdentifier];


if (cell == nil) 
{

    NSMutableArray *cellProgressNoteCollection = [self getcellProgressNoteCollectionForLandScape:indexPath];
    cell = [[[UnSavedNoteListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier cellTiles:cellProgressNoteCollection] autorelease];
    cell.backgroundColor = [UIColor clearColor];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

}

//    cell.textLabel.text = [NSString stringWithFormat:@"%d", rand()];
//    cell.textLabel.textColor = [UIColor redColor];
// Configure the cell...

return cell;
}

2 ответа

Одна вещь, которую я замечаю, это то, что вы не используете повторно ни один из ваших uitableviewcells, так что вы, вероятно, получаете большой удар по производительности. В приведенном выше коде вы создаете новый идентификатор ячейки для каждой строки. Попробуйте это вместо этого:

- (UITableViewCell *) tableView:(UITableView *)inTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    NSString *CellIdentifier = @"Cell";
    UnSavedNoteListCell  *cell = (UnSavedNoteListCell *)[inTableView  dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        NSMutableArray *cellProgressNoteCollection = [self getcellProgressNoteCollectionForLandScape:indexPath];
        cell = [[[UnSavedNoteListCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier cellTiles:cellProgressNoteCollection] autorelease];
        cell.backgroundColor = [UIColor clearColor];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    }

    return cell;
}

Таким образом, ваш табличный вид может поддерживать список ячеек, помеченных для повторного использования.

Лучший вопрос: почему у вас нет пула авто-релизов?

Вот некоторые из вызовов, которые вы делаете в этом коде, для которых может потребоваться пул автоматического выпуска. (Некоторые из них, вероятно, нет, на самом деле.)

  • stringByAppendingString
  • stringWithFormat
  • dequeueReusableCellWithIdentifier
  • autorelease
  • getcellProgressNoteCollectionForLandScape (если это написано в соответствии с соглашениями)
  • clearColor (теоретически, но, вероятно, нет)

UIKit требует пула автоматического выпуска.

У меня есть две возможные причины, которые я вижу:

  1. Ваш пул авто-релизов исчез. (Куда это делось?)
  2. Это вызывается из потока, отличного от основного потока.
Другие вопросы по тегам