2014-04-02 44 views
31

我得到了的NSLog行警告:格式字符串不是一个字符串(可能不安全)

Format string is not a string literal(potentially insecure) 

警告从下面的代码

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

我可以问为什么之后我改变了换成下面的代码,警告消失了?

NSLog(immutableString,nil); 
+0

只需注意永远不要用大写字母开始变量。这只是一个不好的做法,你不想开始做。它应该是'* marqueeMessage',而不是'* MarqueeMessage'。 –

回答

65

这只是编译器的说法,“嘿,你真的知道你在做什么吗?”编译器担心输入字符串可能包含一个百分号字符%,并且您没有指定相应的参数。很明显,根据你提供的代码,情况并非如此,但编译器不够聪明,无法弄清楚。

通过添加一个参数(可以是任何包括数字,字符串或零的任何参数),您可以说服编译器知道自己在做什么。让编译器感到开心的另一种方法是用这样的代码输出字符串。

NSLog(@"%@", immutableString); 

这种方法的优点是,字符串(例如%s)在意想不到的格式说明将不会引起任何问题。

+14

但是这并不回答**潜在的不安全**方面,因此您可以参考[本答案](http://stackoverflow.com/a/5428346/468724) –

相关问题