2014-04-02 8 views
31

erhalte ich die Warnung in der NSLog LinieAchtung: Format-String ist kein Stringliteral (potentiell unsicher)

Format string is not a string literal(potentially insecure) 

Aus dem folgenden Code

NSMutableString *MarqueeMessage = [[NSMutableString alloc]init]; 
[MarqueeMessage appendString:@"Abc"]; 
NSString *immutableString = MarqueeMessage; 
NSLog(immutableString); 

Darf ich fragen, warum, nachdem es das geändert Zeile in den folgenden Code, die Warnung ist weg?

NSLog(immutableString,nil); 
+0

Nur eine Anmerkung, um Ihre Variablen niemals mit einem Großbuchstaben zu beginnen. Das ist nur eine schlechte Übung, die Sie nicht beginnen wollen. Es sollte "* MarqueeMessage" sein, nicht "* MarqueeMessage". –

Antwort

65

Das ist nur die Art und Weise, wie der Compiler sagt: "Hey, weißt du wirklich, was du tust?" Der Compiler ist besorgt, dass die Eingabezeichenfolge ein Prozentzeichen % enthalten kann, und Sie haben das entsprechende Argument nicht angegeben. Das ist natürlich nicht der Fall, der auf dem von Ihnen bereitgestellten Code basiert, aber der Compiler ist nicht intelligent genug, um das herauszufinden.

Durch das Hinzufügen eines Arguments (das alles sein kann, einschließlich einer Zahl, einer Zeichenfolge oder einer Null), überzeugen Sie den Compiler, dass Sie wissen, was Sie tun. Die alternative Möglichkeit, den Compiler glücklich zu machen, besteht darin, die Zeichenfolge mit einem Code wie diesem auszugeben.

NSLog(@"%@", immutableString); 

Der Vorteil dieser Methode ist, dass unerwartete Format-Spezifizierer in der Zeichenfolge (beispiel %s) keine Probleme verursachen.

+14

Aber dies beantwortet nicht den ** potenziell unsicheren ** Aspekt und dafür können Sie [diese Antwort] beziehen (http://stackoverflow.com/a/5428346/468724) –

Verwandte Themen