为啥这段代码调用自动释放池?
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 需要一个自动释放池。
我认为您有两个潜在的原因:
-
您的自动释放池已消失。 (它去哪儿了?)
这是从主线程以外的线程调用的。
【讨论】:
以上是关于为啥这段代码调用自动释放池?的主要内容,如果未能解决你的问题,请参考以下文章
为啥有时会立即释放内存,而有时仅在自动释放池耗尽时才释放内存?