2010-08-27 2 views
3

J'ai un tableau d'objets NSNumber créé ainsi:avertissement variable inutilisée sur pour chaque boucle

 myArray = [[NSMutableArray alloc] initWithObjects:[NSNumber numberWithDouble:0.0], 
       [NSNumber numberWithDouble:0.0], 
       [NSNumber numberWithDouble:0.0], 
       [NSNumber numberWithDouble:0.0], 
       [NSNumber numberWithDouble:0.0], nil]; 

(Bien que juste pour moi que je aurais pu faire

myArray = [NSMutableArray arrayWithObjects: object1, etc..., nil]; 

et Ignoré . alloc tout ce qui serait mieux)

Quoi qu'il en soit, il est tangente à ma question:

au cours de la vie de l'application, les valeurs se sont modifiées. À un certain moment, je veux les réinitialiser tous à zéro. Voici comment je le fais maintenant:

for (NSNumber *number in myArray) { 
    number = [NSNumber numberWithDouble:0.0]; 
} 

Mais l'analyseur statique jette un avertissement parce qu'il pense « nombre » est une variable non utilisée (ce qui est techniquement - défini et n'a jamais utilisé de nouveau). Existe-t-il un meilleur moyen de mettre à zéro tous les éléments du tableau? Peut-être remplacer le tableau avec un nouveau? Qu'est-ce qui serait le plus rapide et éviterait l'avertissement d'analyse statique?

+0

Pour les personnes de l'avenir qui viennent à travers cette question: depuis iOS 6 et Mountain Lion, vous pouvez utiliser de nouveaux littéraux Obj-C, donc '[NSNumber numberWithDouble: 0.0]' devient '@ 0.0', et' [NSArray arrayWithObjects: obj1, obj2, ..., nil ] 'devient' @ [obj1, obj2, ...] '. –

Répondre

7

En ce qui concerne la création d'un tableau, rappelez-vous que alloc + initWithObjects: exige une libération explicite par la suite, alors que la méthode pratique arrayWithObjects: ne pas (et aussi, il ne survivra pas à une itération de la boucle d'exécution, sauf si vous conserviez il).

for (NSNumber *number in myArray) { 
    number = [NSNumber numberWithDouble:0.0]; 
} 

Cette boucle ne fonctionne pas comme vous le pensez. number simplement des points à une instance NSNumber, et tout ce que vous faites est de changer number pour pointer vers une autre instance de NSNumber, il ne modifie pas l'instance d'origine de NSNumber dans myArray.

NSNumber instances sont immuables, la seule façon de les définir tous à zéro serait d'effacer complètement le contenu de myArray et le remplir de nouveau avec [NSNumber numberWithDouble:0.0]

NSUInteger count = [myArray count]; 
[myArray removeAllObjects]; 

while(count--) 
    [myArray addObject:[NSNumber numberWithDouble:0.0]]; 
+2

Vous pouvez éviter d'itérer deux fois dans le tableau en utilisant '-replaceObjectAtIndex: withObject:' dans votre boucle while. Ensuite, vous n'avez pas besoin de '-removeAllObjects' – JeremyP

Questions connexes