Problème avec la méthode copy de NSObject

Snoopy_87Snoopy_87 Membre
18:39 modifié dans Vos applications #1
Bonjour,

Je suis en train de développer un jeux. Le code ci-dessous, me permet, d'insérer le nouveau score effectué par le joueur et de déplacer les autres. rangArray est un NSMutableArray qui contient 5 objects NSMutableDictionary. Le dictionnaire contient le nom du joueur, le score, le nombre de mouvement.... Lorsque le score réalisé est le premier, le programme fonctionne correctement. Le problème vient quand le score n'est pas le meilleur (2ème place, 3ème place....). A ce moment donné, cette erreur apparaà®t :  *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'*** J'ai utilisé le mode débugage sur cette partie du code. Je me suis rendu compte que lorsque j'effectue la ligne temp1 = [[rangArray objectAtIndex:i]copy]; le pointeur temp1 pointe sur le même objet que celui du tableau. et à  la ligne suivante le programme lance l'erreur. Ce que je ne comprend pas c'est que lorsque je copie le premier élément du tableau (i = 0) le programme fonctionne. Par contre avec les autres valeur ca ne fonctionne  plus.

BOOL insertScore = FALSE;

// create temporary variables
NSMutableDictionary *temp1 = nil;
NSMutableDictionary *temp2 = nil;

// browse the ranging array
for (int i = 0 ; i < [rangArray count] ; i++)
{
if (score >= [[[rangArray objectAtIndex:i] objectForKey:@SCORE_SCORE] intValue] && !insertScore)
{
temp1 = [[rangArray objectAtIndex:i] copy];

// to fill old infoscore wiht the new info score
[[rangArray objectAtIndex:i] setObject:pseudo forKey:@PSEUDO_SCORE];
[[rangArray objectAtIndex:i] setObject:timeString forKey:@TIME_SCORE];
[[rangArray objectAtIndex:i] setObject:movesString forKey:@MOVES_SCORE];
[[rangArray objectAtIndex:i] setObject:scoreString forKey:@SCORE_SCORE];

insertScore = TRUE;
}
else if (insertScore)
{
if (temp2 == nil)
{
temp2 = [[rangArray objectAtIndex:i] copy];

[rangArray replaceObjectAtIndex:i withObject:temp1];
[temp1 release];
temp1 = nil;
}
else
{
temp1 = [[rangArray objectAtIndex:i] copy];

[rangArray replaceObjectAtIndex:i withObject:temp2];
[temp2 release];
temp2 = nil;
}

}
}


Merci d'avance pour vos réponses

Snoopy

Réponses

Connectez-vous ou Inscrivez-vous pour répondre.