Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UITableView';内存泄漏问题_Iphone_Uitableview_Ios_Memory Leaks - Fatal编程技术网

Iphone UITableView';内存泄漏问题

Iphone UITableView';内存泄漏问题,iphone,uitableview,ios,memory-leaks,Iphone,Uitableview,Ios,Memory Leaks,大家好 我有一个UITableView,其中包含从sqllite获取的项目列表。但是渲染视图时内存泄漏。下面是我的cellForRowAtIndexPath方法 static NSString *CellIdentifier = @"BarListItemCell"; BarListItemViewCell *cell = (BarListItemViewCell *)[tableView dequeueReusableC

大家好 我有一个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(@“单位计数为%d”,[unit retainCount]);”。非常奇怪的是,viewDidLoad之后,控制台显示3行“unit count is 2”(我在整个屏幕中有3个项目)。但当我拖动屏幕让UITableView显示下一项时,控制台显示“unit count is 1”。调用[tableView reloadData]方法时,控制台也会显示“单位计数为1”。因此,UITableView似乎会自动释放数据源。这就是为什么我保持单元的内存引用计数为2,否则会发生过度释放。但代价是单元占用的内存永远不会被释放

不要调用-重新计数。 一个物体的绝对计数是没有意义的

您应该调用
release
的次数与使对象保留的次数完全相同。不少于(除非你喜欢泄漏),当然,不多于(除非你喜欢崩溃)

有关详细信息,请参阅


根据您的描述,
单元的保留计数并不奇怪。您的代码似乎正在打印对象的保留计数,该对象可能在当前通过事件循环期间创建,也可能未创建,因此可能已多次保留/自动删除。或者不是。没关系

重要的是分配工具显示了什么。你看到物体随着时间的推移不断增加吗?如果是,它们是什么?是什么在保留它们(或不释放它们)

如果您这样做,可能会证明这种情况对您有用。

不要调用-retainCount。 一个物体的绝对计数是没有意义的

您应该调用
release
的次数与使对象保留的次数完全相同。不少于(除非你喜欢泄漏),当然,不多于(除非你喜欢崩溃)

有关详细信息,请参阅


根据您的描述,
单元的保留计数并不奇怪。您的代码似乎正在打印对象的保留计数,该对象可能在当前通过事件循环期间创建,也可能未创建,因此可能已多次保留/自动删除。或者不是。没关系

重要的是分配工具显示了什么。你看到物体随着时间的推移不断增加吗?如果是,它们是什么?是什么在保留它们(或不释放它们)


如果您这样做,可能会证明这种情况对您有用。

谢谢您的回答,我将首先阅读内存管理指南。但情况是,我必须始终拥有UITableView的数据源的所有权,这意味着我不能向数据源发送自动释放方法。但是在调用[tableView reloadData]之前,我将把数据源引用分配给一个新的列表/字典。这是否意味着我必须首先手动释放上一个数据源?谢谢您的回答,我将首先阅读内存管理指南。但情况是,我必须始终拥有UITableView的数据源的所有权,这意味着我不能向数据源发送自动释放方法。但是在调用[tableView reloadData]之前,我将把数据源引用分配给一个新的列表/字典。这是否意味着我必须先手动释放上一个数据源?