Почему этот код вызывает пул автоматического выпуска?
Я вижу следующий журнал...
"__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 требует пула автоматического выпуска.
У меня есть две возможные причины, которые я вижу:
- Ваш пул авто-релизов исчез. (Куда это делось?)
- Это вызывается из потока, отличного от основного потока.