3

每次 UITableview 滚动,都会有 48 个字节的内存泄漏。负责库:libsystem_c.dylib 负责框架:strdup。

这仅在 iOS 5.1 上观察到,而不在早期版本上观察到。其他人也面临同样的问题吗?这是 iOS 5.1 中的错误吗?

代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath(NSIndexPath *)indexPath 
{
    NSString *cellIdentifier = [[NSString alloc] initWithString:@"fontSelectionCell"];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    [cellIdentifier release];

    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }       

    cell.textLabel.text = [fontNameList objectAtIndex:[indexPath row]];
    cell.selectionStyle =UITableViewCellSelectionStyleGray;
    cell.textLabel.font = [UIFont systemFontOfSize:17.0];

    if ([fontName isEqualToString:cell.textLabel.text])
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.textLabel.textColor = [UIColor blueColor];

    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.textLabel.textColor = [UIColor blackColor]; 
    }

    return cell;
}
4

2 回答 2

1

这可能是由于您处理单元标识符的方式。我实际上很惊讶它不会为您崩溃,因为您释放cellIndentifier但在创建新单元格时引用它(即当一个单元格没有返回以重新使用时dequeueReusableCellWithIdentifier)。

使用单元格标识符的标准/公认方法是使用静态(因为它永远不会改变,并且它只会被分配一次,而不是潜在的 100 次,因为cellForRowAtIndexPath在滚动表格时会不断调用)。这将使您的代码更有效率。

IE

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    static NSString *cellIdentifier = @"fontSelectionCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }   

   ...
}

你可以尝试改变cellIdentifier,看看你是否仍然得到泄漏?

于 2012-04-18T09:14:04.423 回答
0

我认为您遇到了已经在 iOS 5.1 上报告的问题。我自己也有。目前我无法在苹果论坛中找到有关此问题的链接。

于 2012-04-18T13:06:43.487 回答