2010-11-15 4 views
1

У меня есть моя функция getAllData, которая возвращает массив с помощью диктаторов.MemoryLeaking - question

- (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 и результат ...

ответ

1

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

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

[[object getAllData] retain]; 

Затем инструмент утечки будет определить утечку массива, Словарь и результат, и указать вам getAllData как метод, в котором они были первоначально созданы.

+0

Tommy, U сделал мой день! [[object getAllData] сохранить]; -> [object getAllData]; – f0rz

0

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

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