1. ホーム
  2. objective-c

[解決済み] 警告 : フォーマット文字列は文字列リテラルではありません (安全でない可能性があります)

2022-02-14 21:50:33

質問

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);

解決方法は?

これは、コンパイラが、入力文字列にパーセント文字が含まれることを懸念して、「おい、何をやっているか本当にわかっているのか」と言いたいだけなのです。 % そして、それに対応する引数を指定していない。 明らかに、あなたが提供したコードからするとそうではないのですが、コンパイラはそれを理解するほど賢くないのです。

引数(数値、文字列、nilなど何でもよい)を追加することで、自分が何をしているのかわかっているとコンパイラーに思わせるのです。 コンパイラーを満足させる別の方法は、次のようなコードで文字列を出力することだ。

NSLog( @"%@", immutableString );

この方法の利点は,文字列中の予期せぬ書式指定子(たとえば %s を使用すると、問題が発生することはありません。