2011-01-21 1 views
0

Je ne suis pas sûr du problème avec cette boucle, mais je continue à recevoir SIGABRT chaque fois que je l'exécute. Selon le journal, le problème est lorsque j'essaie d'ajouter le NSNumber au tableau NSMutable près de la fin de la boucle. Évidemment j'ai fait une erreur élémentaire mais je ne suis pas sûr du problème.Problème Ajout à NSMutableArray en boucle

NSArray *toArray = [ourDictionary objectForKey:toString]; 
NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init]; 
while (done == NO) 
{ 
    if (i == 10) 
     done = YES; 
      /* 
      *The job here is to multiply these three numbers together and store the 
      *product in the mutable array. It tells me NSObject did not recognize selector 
      *and then crashes. 
      *original and multiplyFrom are always the same value, and multiplyTo is updated 
      *from an array I made above from a p-list. 
      *I'm hoping I didn't make a ton of rookie mistakes here, but I'm new to dealing with 
      *NSMutableArray and such. 
      */ 

    NSNumber *original = [NSNumber numberWithDouble:convertThis]; 
    NSNumber *multiplyFrom = [NSNumber numberWithDouble:multiply]; 
    NSNumber *multiplyTo = [NSNumber numberWithDouble:[[toArray objectAtIndex:i] doubleValue]]; 
    NSNumber *product = [[NSNumber alloc] init]; 

    product = [NSNumber numberWithDouble:([original doubleValue] * 
              [multiplyFrom doubleValue] * 
              [multiplyTo doubleValue])]; 

    [allValuesMArray addObject:product]; 
      //This line ^^^ causes crash 
    i++; 
} 
NSArray *returnThisArray = allValuesMArray; 
[allValuesMArray autorelease]; 
return returnThisArray; 
+0

Pouvez-vous ajouter l'historique du journal ici? – Sarah

+1

S'il vous plaît montrer plus de code, en particulier la création de 'allValuesMArray'. En outre, supprimez '[product release]', ce qui causera un plantage plus tard. Et enfin, les constantes appropriées pour le type BOOL sont 'YES' /' NO', pas 'TRUE' /' FALSE' –

+0

J'ai modifié le code pour montrer plus de ce qui se passe, si cela ne suffit pas encore laissez-moi savoir ce que vous devez voir d'autre. Tout ce qui est au-dessus de la boucle devrait fonctionner correctement, je ne suis pas sûr exactement la meilleure méthode pour obtenir ce que je veux. Le but de cette méthode est de lire une liste de nombres de toArray, de calculer le produit, de stocker chaque produit dans un nouveau tableau qui sera ensuite retourné et écrit dans une p-list. – Justin

Répondre

0

Vous libérez le allValuesMArray: [allValuesMArray release];

Étant donné que le nombre de rétention est 0 à ce stade, le tableau sera immédiatement libéré.

Essayez d'utiliser [allValuesMArray autorelease]. Cela libérera le tableau dans le futur, donnant la possibilité à la méthode appelante d'utiliser le tableau non libéré ou de conserver le tableau pour une utilisation ultérieure.

Vous pouvez également vérifier si le produit n'est pas nul avant de l'ajouter à la matrice.

Et vous avez une fuite de mémoire.

product = [[NSNumber alloc] init];

Ensuite, vous lui assignerez un objet différent plus tard.

+0

J'ai eu autorelease avant de faire une erreur quand je le copiais, mon problème est à l'intérieur de la boucle, en particulier la ligne [allValuesMArray addObject: product]; – Justin

+0

Etes-vous sûr que le produit n'est pas nul? Quelle est la valeur double de [original doubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue]? – martinws

+0

qui semble fonctionner, par exemple si j'assigne ([original doubleValue] * [multiplyFrom doubleValue] * [multiplyTo doubleValue]) à un double, il me donne une réponse, mais je crains que pour une raison quelconque, je ne comprends pas la bonne façon d'ajouter des objets à un tableau mutable ... – Justin

0

Je suis sûr que c'est une faute de frappe, mais vous n'allouez pas un pointeur et même pas un type de NSMutableArray, mais de type NSArray. Vérifiez la ligne 2:

NSMutableArray allValuesMArray = [[NSArray alloc] init]; 

Il devrait être

NSMutableArray *allValuesMArray = [[NSMutableArray alloc] init]; 
+0

oui c'était une faute de frappe! – Justin

+0

@Justin Alors s'il vous plaît prenez le temps et réparez-le. Les deux! – danyowdee

0

Créez-vous un NSArray et l'assigner à un NSMutableArray? Peut-être que vous vouliez dire ce qui suit:

NSMutableArray* allValuesMArray = [[NSMutableArray alloc] init]; 
0

Voici votre code dans un nettoyé-, sous forme non-fuite:

NSMutableArray *convertedValues = [NSMutableArray array]; 
// moved outside of the loop and descriptively named: 
double normalizedValue = convertThis * multiply; 
// make use of NSFastEnumeration -- better readability _and_ reliability 
for (NSNumber *scaleFactor in [ourDictionary objectForKey:toString]) 
{ 
    // just in case you want to add a breakpoint to see if everything works as expected: 
    double convertedValue = normalizedValue * [scaleFactor doubleValue]; 
    [convertedValues addObject:[NSNumber numberWithDouble:convertedValue]]; 
} 
return convertedValues; 

Si quelque chose va mal avec ce code, je parie que le tableau retourné par [ourDictionary objectForKey:toString] contient au moins une instance qui n'est pas un NSNumber - que vous reconnaîtrez par un NSException levé à [scaleFactor doubleValue].