【问题标题】:UITableView's memory leaking issueUITableView 的内存泄漏问题
【发布时间】:2011-06-03 11:06:59
【问题描述】:

大家好 我有一个 UITableView ,其中包含从 sqllite 获取的项目列表。但是渲染视图时存在内存泄漏。以下是我的 cellForRowAtIndexPath 方法。

static NSString *CellIdentifier = @"BarListItemCell";


BarListItemViewCell *cell = (BarListItemViewCell *)[tableView 
                                  dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil) {
    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"BarListItemViewCell" owner:self options:nil];
    for (id cellObject in nib) {
        if ([cellObject isKindOfClass : [BarListItemViewCell class]]) {
            cell = (BarListItemViewCell *) cellObject;
            //break;
        }
    }
    NSString * key =   [keys objectAtIndex:[indexPath section]];
    NSDictionary * unit = [[barListDataSource objectForKey:key] objectAtIndex:[indexPath row]];

    NSLog(@"unit count is %d", [unit retainCount]);

    cell.name.text = [unit objectForKey:@"name"];
    cell.address.text = [unit objectForKey:@"address1"];
    cell.features.text = [unit objectForKey:@"features"];
    cell.logo.image = [UIImage imageWithData:[unit objectForKey:@"logo"]];  
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}    
return cell;

你可以看到“NSLog(@"unit count is %d", [unit retainCount]);”这一行。很奇怪,viewDidLoad之后,控制台显示3行“unit count is 2”(我全屏有3项)。但是当我拖动屏幕让 UITableView 显示下一个项目时,控制台显示“unit count is 1”。当调用 [tableView reloadData] 方法时,控制台也会显示“unit count is 1”。所以看起来 UITableView 会自动释放数据源。这就是为什么我将单元的内存引用计数保持为2,否则会发生过度释放。但是代价是unit占用的内存永远不会被释放!

【问题讨论】:

    标签: iphone uitableview ios memory-leaks


    【解决方案1】:

    不要调用 -retainCount。

    对象的绝对保留计数是没有意义的。

    您应该调用release 的次数与您导致对象被保留的次数完全相同。不会少(除非您喜欢泄漏),当然也不会更多(除非您喜欢崩溃)。

    详情请参阅Memory Management Guidelines


    根据您的描述,unit 的保留计数没有什么奇怪的。您的代码似乎正在打印在当前通过事件循环期间可能已创建或未创建的对象的保留计数,因此可能已多次保留/自动释放。或不。没关系。

    重要的是分配工具显示的内容。随着时间的推移,您是否看到物体的堆积?如果是这样,它们是什么以及保留它们(或不释放它们)的原因是什么?

    如果你这样做了,Heapshot analysis 可能对你有用。

    【讨论】:

    • 感谢您的回答,我会先阅读内存管理指南。但情况是我必须始终拥有 UITableView 数据源的所有权,这意味着我不能向数据源发送自动释放方法。但在调用 [tableView reloadData] 之前,我会将数据源引用分配给新的列表/字典。这是否意味着我必须先手动释放以前的数据源?
    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多