2009-10-31 7 views
0

Je suis assez nouveau à Objective-C et tout en exécutant l'analyseur statique Clang cette section de code m'a donné l'erreur suivanteAvertissement Pass-by-Value?

warning: Pass-by-value argument in message expression is undefined 
[artistCollection removeObject:removeArtist]; 

Quelqu'un peut-il jeter toute la lumière sur cet avertissement pour moi?

case 6: 
    NSLog(@"(*) - First Name:"); 
    scanf("%s", userFirName); 
    objFirName = [[NSString alloc] initWithUTF8String:userFirName]; 
    for(eachArtist in artistCollection) { 
     if([[eachArtist firName] isEqualToString: objFirName]) { 
      removeArtist = eachArtist; 
     } 
    } 
    [artistCollection removeObject:removeArtist]; 
    [objFirName release], objFirName = nil; 
    break; 

gary

+0

Quoi et où sont vos définitions de 'removeArtist' et' eachArtist'? – Wevah

+0

En fait, initialisez 'removeArtist' comme 'nil'? Sinon, et il n'est pas défini dans la boucle, il sera indéfini lorsque vous appelez 'removeObject:'. – Wevah

+1

pourriez-vous décrire la logique de ceci? Qu'essayez-vous de faire (en anglais ou en pseudo-code, pas en code obj-c)? –

Répondre

3

Si vous ne recevez jamais un match sur cette if dans votre boucle (car userFirName n'est pas dans votre collection), removeArtist rien ne sera jamais attribué une valeur. Attribuez-lui une valeur avant de commencer la boucle (nil, probablement), et cela devrait aller.

+0

Merci, une erreur idiote, essayant toujours de maîtriser cela. Deux questions, je comprends qu'il est mauvais de supprimer de la boucle for, c'est pourquoi je supprime l'objet à l'extérieur. Ai-je raison de penser cela? Enfin, devrais-je avoir une version de [removeArtist] là-dedans? en le regardant maintenant, j'ai l'impression de le faire. – fuzzygoat

+0

Oui, si vous essayez de modifier le tableau pendant que vous êtes dans la boucle, vous obtiendrez une exception, selon les docs. Je ne sais pas si vous avez besoin d'une version [removeArtist] '; la collection le lancera quand vous appellerez 'removeObject:', vous n'aurez donc pas besoin de le faire vous-même, sauf si vous l'avez conservé ailleurs pour une raison quelconque (je ne m'attendrais probablement pas). –

+0

L'extrait de document mentionné ci-dessus: «L'énumération est 'sûre' - l'énumérateur a une garde de mutation de sorte que si vous tentez de modifier la collection pendant l'énumération, une exception est levée. - http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW1 –