为啥这段代码调用自动释放池?

Posted

技术标签:

【中文标题】为啥这段代码调用自动释放池?【英文标题】:Why is this code calling an auto release pool?为什么这段代码调用自动释放池? 【发布时间】:2011-05-16 16:49:06 【问题描述】:

我看到以下日志...

“__NSAutoreleaseNoPool(): 类 UITableViewCellContentView 的对象 0x58264b0 自动释放,没有适当的池 - 只是泄漏”

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

我有一个 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;

【问题讨论】:

【参考方案1】:

我确实注意到的一件事是,您没有重复使用任何 uitableviewcell,因此您的性能可能会受到很大影响。在上面的代码中,您正在为每一行创建一个新的单元格标识符。试试这个:

- (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 可以维护一个表单元列表,这些表单元被标记为可重用。

【讨论】:

【参考方案2】:

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

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

stringByAppendingString stringWithFormat dequeueReusableCellWithIdentifier autorelease getcellProgressNoteCollectionForLandScape(如果按照约定编写) clearColor(理论上,但可能不是)

UIKit 需要一个自动释放池。

我认为您有两个潜在的原因:

    您的自动释放池已消失。 (它去哪儿了?) 这是从主线程以外的线程调用的。

【讨论】:

以上是关于为啥这段代码调用自动释放池?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有时会立即释放内存,而有时仅在自动释放池耗尽时才释放内存?

具有大量自动释放对象的线程如果是/否,在这种情况下是不是必须使用自动释放池,为啥?

方法返回的对象会被放入自动释放池吗?

在帧写入循环中使用和不使用自动释放池的内存占用,为啥?

为啥 __weak 变量未在自动释放池中注册?

谁调用自动释放池