为什么此代码调用自动释放池?

时间:2011-05-16 16:49:06

标签: ios uitableview autorelease

我看到以下日志......

“__ NSAutoreleaseNoPool():类UITableViewCellContentView的对象0x58264b0自动释放,没有池到位 - 只是泄漏”

这是一个巨大的发布池日志,上面只是我复制的发布日志之一...

我有一个CustomCell,根据业务逻辑将tile添加到自身中。但问题是当我调用单元格的创建时,我看到上面的日志消息。我没有看到我的代码有什么问题..有没有人对它有任何线索?

- (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 个答案:

答案 0 :(得分:0)

我注意到的一件事是你没有重复使用任何你的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;
}

这样,您的tableview可以维护一个标记为可重用的tablecells列表。

答案 1 :(得分:0)

更好的问题是为什么你没有自动释放池。

以下是您在该代码中进行的一些可能需要自动释放池的调用。 (其中有些可能不会,实际上。):

  • stringByAppendingString
  • stringWithFormat
  • dequeueReusableCellWithIdentifier
  • autorelease
  • getcellProgressNoteCollectionForLandScape(如果是按惯例编写的)
  • clearColor(理论上,但可能不是)

UIKit需要自动释放池。

我看到了两个可能的原因:

  1. 您的自动发布池已消失。 (它去了哪里?)
  2. 这是从主线程以外的线程调用的。