"format string is not a string literal" dans une NSAlert : comment faire ?
colas_
Membre
Bonjour j'ai un un warning
"format string is not a string literal"
(qui ne produit pas d'erreur) sur les lignes suivantes :
NSString * auxText ;
auxText = [NSString stringWithFormat:@Test %@", aString];
NSAlert * myAlert ;
myAlert = [NSAlert alertWithMessageText:mainText
defaultButton:@OK
alternateButton:nil
otherButton:nil
informativeTextWithFormat:auxText] ;
J'ai le même warning dans un cas un peu plus subtil :
- (NSString *)someText:(BOOL)aBool
{
NSMutableString * result = [@"" mutableCopy] ;
(...)
NSString * tempString = [NSString stringWithFormat:...] ;
(...)
[result appendString:tempString] ;
}
- (void)myMethod
{
(...)
NSAlert * myAlert ;
myAlert = [NSAlert alertWithMessageText:mainText
defaultButton:@OK
alternateButton:@Annuler
otherButton:nil
informativeTextWithFormat:[self someText:YES]] ;
(...)
}
J'imagine que vous avez déjà rencontré ce warning.
Peut-on supprimer le warning tout en gardant la factorisation ?
Et vous, que faites-vous ? (J'ai lu ici qu'il est bien de garder son projet à 0 warning. J'en ai 44 et je vais essayer des les supprimer !)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Regarde dans les options de compilation si tu as un truc du genre: -Wformat-nonliteral
Extrait de la doc GCC 4.7:
informativeTextWithFormat:@%@",auxText] ;
ça marche, mais je trouve ça vachement moins clair (et pas très joli).
Est-ce préférable de faire comme tu dis pour d'autres raisons (plus de robustesse) ?
Merci !
C'est un waning optionnel du compilateur, supprime-le et tu n'auras plus ce message.
Le but est d'éviter un plantage possible dans la forme:
NSLog(str);
si str contient des arguments de la forme %xx
écrire NSLog(@%@",str) éllimine ce problème.
Si [self someText:YES] retourne une chaà®ne qui par hasard contient un token de format genre "%@ ou %d" ou "%.H" ou autre n'importe où dans cette string, plantage assuré. C'est ce dont parle mpergand sauf que ce problème n'est pas limité aux NSLog mais à toutes les méthodes qui prennent un format + nombre variable d'arguments en paramètres.
Le warning est explicite : ce qui est attendu est une chaà®ne de format, contenant des placeholders, et que tu fera suivre d'arguments. Donc c'est ça que tu dois donner et pas directement la chaà®ne elle même.
Donc la bonne solution est celle de devulder. Il n'est acceptable d'ignorer ce warning que si [self someText:YES] était une méthode faite exprès pour retourner une chaà®ne de format, contenant toujours les mêmes placeholders dans le même ordre de picking (par exemple "%d - %f" ou "%d + %f" ou le plus subtil "%2$f - %1$d" selon les paramètres d'entrée mais que au moins y' ait toujours un placeholders %d correspondant au premier paramètre et %f pour le 2 eme). Cas d'usage qui est quand même assez rare.