2010-11-15 14 views
1

J'ai ma fonction getAllData, qui renvoie un tableau avec des dictons.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]; 
} 

Quelqu'un peut-il voir des mémoires évidentes dans mon code? Je reçois le tableau de fuite de mémoire, dict, et le résultat ...

Répondre

1

Du code, je dois demander: vous êtes au courant que addObject: ne copie pas l'objet? Donc, mettre des valeurs à dict, puis l'ajouter au résultat, puis supprimer tout de dict laisse juste un dictionnaire vide dans le résultat? Je pense que vous voudrez probablement utiliser la méthode 'copy' pour faire des copies du tableau et du dictionnaire. Ou, mieux encore, créez simplement le dictionnaire lorsque vous l'ajoutez au résultat en utilisant l'une des méthodes de classe. Quoi qu'il en soit, puisque je ne vois pas de fuites dans ce cas, il est plus probable que quiconque reçoit le résultat de getAllData le faille par la suite. Si pour une raison folle vous avez eu quelque part un chien errant:

[[object getAllData] retain]; 

Ensuite, l'outil de fuites identifierait une fuite de tableau, dict et le résultat et le point que vous getAllData la méthode dans laquelle ils ont été créés à l'origine.

+0

Tommy, j'ai fait ma journée! [[object getAllData] conserve]; -> [object getAllData]; – f0rz

0

Je devrais vraiment dire avant que je réponds à ma connaissance sur ce est très limité, alors prenez cela en considération. Mais il me semble que vous avez un conteneur à l'intérieur d'un conteneur. Et quand vous réservez de la mémoire pour cela, vous devez le rétrograder. Par exemple, Store n (B_Containers) dans le conteneur A réserve n_B conteneurs et 1 un conteneur. Pour annuler la réservation de la mémoire, vous devez annuler la réservation de nB_Containers avant de supprimer A ou tous les B_Containers seront sans référence et circuleront dans votre mémoire.