2010-08-02 4 views
1

Je déteste poser des questions de gestion de la mémoire - toutes les bonnes réponses sont des variations sur RTFM. Mais celui-ci me bouscule.problème de mémoire mgmt dans le dictionnaire complexe

J'ai un dictionnaire (relativement) complexe dans ma classe de modèle, où chaque clé pointe vers un tableau de tableaux. Je constamment ajouter et supprimer articles, selon l'état. Chaque "élément" est un tableau.

- (void)addToDictionary:(NSNumber *)itemID { 

     // get what we need (associated array of arrays & key) from the incoming ID 
     NSArray *incomingArray = [self getArrayFromID:[itemID intValue]]; 
     NSString *myKey = [incomingArray objectAtIndex:0]; 

     NSMutableArray *myNewArray = [[NSMutableArray alloc] init]; 

     // case 1: this key is not in the dictionary yet 
     if ([[myDict allKeys] containsObject:myKey] == NO) { 
      [myNewArray addObject:incomingArray]; 
      [myDict setObject:myNewArray forKey:myKey]; 

     // case 2: key already there; add new array to its array 
     } else { 
      myNewArray = [NSMutableArray arrayWithArray:[myDict objectForKey:myKey]]; 
      [myNewArray addObject:incomingArray]; 
      [myDict removeObjectForKey:myKey]; 
      [myDict setObject:myNewArray forKey:myKey]; 
     } 
     // why isn't this line working?? 
     [myNewArray release]; 
} 

Ma question est la dernière ligne. J'ai alloué ce tableau pour m'aider à travailler avec le dictionnaire, et maintenant je n'en ai plus besoin. Mais le programme va planter si je le libère, et fonctionne très bien si je commente cette ligne. Qu'est-ce que je rate? TIA

+0

'si ([[mondict AllKeys] containsObject: myKey] == NO)' doit être écrit 'si ([mondict objectForKey: myKey] == néant) ' – user102008

Répondre

1

Dans le cas deux vous ne possédez pas le tableau retourné. Donc, ne le relâchez que dans le cas 1. Et ne créez pas quelque chose que vous n'utiliserez pas. Le pointeur NSMutableArray sera assigné à d'autres données dans le cas 2, pas à celui que vous avez attribué. Vous ne pouvez donc pas libérer quelque chose que vous ne possédez pas.

- (void)addToDictionary:(NSNumber *)itemID { 
    NSArray *incomingArray = [self getArrayFromID:[itemID intValue]]; 
    NSString *myKey = [incomingArray objectAtIndex:0]; 

    NSMutableArray *myNewArray; 

    if ([[myDict allKeys] containsObject:myKey] == NO) { 
     // Create when you need it 
     myNewArray = [[NSMutableArray alloc] init]; 
     [myNewArray addObject:incomingArray]; 
     [myDict setObject:myNewArray forKey:myKey]; 

     // release when you're done with it 
     [myNewArray release]; 

    } else { 
     myNewArray = [NSMutableArray arrayWithArray:[myDict objectForKey:myKey]]; // you don't own it! 
     [myNewArray addObject:incomingArray]; 
     [myDict removeObjectForKey:myKey]; 
     [myDict setObject:myNewArray forKey:myKey]; 
    } 
    // why isn't this line working?? 
    //[myNewArray release]; 
    // because in case 2 it's not pointing to the right memory 
} 

espérons que cela fonctionne, ief2

+0

merci, ief2. Cela fonctionne vraiment, et m'a vraiment aidé à comprendre pourquoi je le faisais mal avant. – coco

Questions connexes