Memory leaks 使用字典从数组中提取内存

Memory leaks 使用字典从数组中提取内存,memory-leaks,ios4,memory-management,Memory Leaks,Ios4,Memory Management,我有一个函数getAllData,它返回一个带有字典的数组 - (NSArray *)getAllData { NSMutableArray *result = [[NSMutableArray alloc] init]; NSArray *data = [skiResorts sortedArrayUsingFunction:comparator context:NULL]; NSString *currentLetter = @"A&qu

我有一个函数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];
}

有人能在我的代码中看到明显的内存泄漏吗?我得到了内存泄漏数组、dict和result…

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


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

在回答之前,我确实应该说,我对这方面的知识非常有限,因此请考虑到这一点。但在我看来,你似乎有一个容器里面的容器。当你为它保留内存时,你必须向后取消它


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

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

无论如何,因为我看不到任何泄漏,更可能的是,无论谁收到getAllData的结果,随后都会泄漏它。如果出于某种疯狂的原因,你有一个流浪汉:

[[object getAllData] retain];

然后,leaks工具将识别array、dict和result的泄漏,并指向getAllData作为最初创建它们的方法。

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

无论如何,因为我看不到任何泄漏,更可能的是,无论谁收到getAllData的结果,随后都会泄漏它。如果出于某种疯狂的原因,你有一个流浪汉:

[[object getAllData] retain];

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

Tommy,你让我开心![[object getAllData]retain];->[对象getAllData];汤米,你让我开心![[object getAllData]retain];->[对象getAllData];