【问题标题】:MemoryLeaking from array with dictionaries带有字典的数组中的内存泄漏
【发布时间】:2010-11-15 14:05:22
【问题描述】:

我有我的函数 getAllData,它返回一个带有字典的数组。

- (NSArray *)getAllData {

    NSMutableArray *result = [[NSMutableArray alloc] init];    
    NSArray *data = [skiResorts sortedArrayUsingFunction:comparator context:NULL];
    
    NSString *currentLetter = @"A";
    NSMutableArray *array = [[NSMutableArray alloc] init] ;
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init] ;
    
    if ([data count] > 0) {
        for (SkiResort *resort in data) {
      
            if ([resort.name hasPrefix:currentLetter]) {
                // Same letter as before.                
                // Add current SkiResort to temporary array.
                [array addObject:resort];
            } else {
                // New letter.                    
                // Add previous header/row data to dictionary.
                [dict setValue:currentLetter forKey:@"header"];
                [dict setValue:array forKey:@"row"];
                
                // Add dictionary to final result array.
                [result addObject:dict];
                
                // Startover ... 
                [array removeAllObjects];
                [dict removeAllObjects];
                
                // Prepare for next letter.
                currentLetter = [resort.name substringToIndex:1];
             
                
                // Add current SkiResort to temporary array.
                [array addObject:resort];
            }
        }
        
        // Add previous header/row data to dictionary.
       [dict setValue:currentLetter forKey:@"header"];
       [dict setValue:array forKey:@"row"];
        
        // Add dictionary to final result array.
       [result addObject:dict];
    }
    [array release];    
    [dict release];   

    return [result autorelease];
}

谁能在我的代码中看到明显的内存泄漏?我得到内存泄漏数组、字典和结果...

【问题讨论】:

    标签: memory-leaks ios4 memory-management


    【解决方案1】:

    从代码中,我不得不问:你知道 addObject: 不会复制对象吗?因此,将值设置为 dict,然后将其添加到结果中,然后从 dict 中删除所有内容只会在结果中留下一个空字典?我认为您可能想在其中使用“复制”方法来复制数组和字典。或者,更好的是,只需在使用类方法之一将字典添加到结果时创建字典。

    无论如何,由于我看不到任何泄漏,更可能是接收到 getAllData 结果的人随后泄漏了它。如果出于某种疯狂的原因,您在某处流浪:

    [[object getAllData] retain];
    

    然后泄漏工具将识别数组、字典和结果的泄漏,并指向 getAllData 作为最初创建它们的方法。

    【讨论】:

    • 汤米,你成就了我的一天! [[object getAllData] 保留]; -> [对象 getAllData];
    【解决方案2】:

    在我回答之前我真的应该说我对此的了解非常有限,所以请考虑到这一点。但在我看来,您在容器中似乎有一个容器。当你为此保留内存时,你必须向后取消保留它。

    例如,Store n (B_Containers) in Container A 保留 n_B 个容器和 1 个 A 容器。要取消保留内存,您需要先取消保留 n 个 B_Containers,然后再删除 A,否则所有 B_Containers 将没有引用并在您的内存中浮动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 2013-09-30
      • 2011-12-07
      相关资源
      最近更新 更多