MemoryLeaking - вопрос - PullRequest
       6

MemoryLeaking - вопрос

1 голос
/ 15 ноября 2010

У меня есть функция 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 и результат ...

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

Из кода я должен спросить: вы знаете, что addObject: не копирует объект?Таким образом, установка значений для dict, затем добавление его к результату, а затем удаление всего из dict просто оставляет пустой словарь в результате?Я думаю, что вы, вероятно, хотите использовать метод «копирования» там, чтобы сделать копии массива и словаря.Или, что еще лучше, просто создайте словарь, когда вы добавляете его в результат, используя один из методов класса.

В любом случае, поскольку я не вижу никаких утечек в этом, гораздо более вероятно, что тот, кто получит результатиз getAllData впоследствии утечка.Если по какой-то сумасшедшей причине у вас где-то был шлюз:

[[object getAllData] retain];

, тогда инструмент утечек определит утечку массива, продиктует и приведет к указанию на getAllData как метод, в котором они были изначально созданы.1006 *

0 голосов
/ 15 ноября 2010

Я действительно должен сказать, что прежде чем ответить, мои знания по этому вопросу ОЧЕНЬ ограничены, поэтому примите это во внимание. Но мне кажется, что у вас есть контейнер внутри контейнера. И когда вы зарезервируете память для этого, вы должны отменить ее назад.

Например, Store n (B_Containers) в контейнере A резервирует n_B контейнеров и 1 A контейнер. Чтобы зарезервировать память, вам нужно сначала зарезервировать n B_Containers, прежде чем удалить A, или все B_Containers будут без ссылки и будут перемещаться в вашей памяти.

...