记忆泄漏 - 问题

时间:2010-11-15 14:05:23

标签: memory-leaks ios4 memory-management

我的函数是get All Data,它返回一个带有dictonaries的数组。

- (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];
}

我的代码中是否有人可以看到明显的内存泄漏?我得到内存泄漏数组,字典和结果......

2 个答案:

答案 0 :(得分:1)

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

无论如何,由于我看不到任何泄漏,更有可能的是接收到getAllData结果的人随后泄漏了它。如果出于某种疯狂的原因,你有一个偏离的地方:

[[object getAllData] retain];

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

答案 1 :(得分:0)

在我回答我的知识之前,我真的应该说非常有限,所以考虑到这一点。但在我看来,就像你在容器内有一个容器。当你为此保留记忆时,你必须向后保留记忆。

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

相关问题