我在NSLog上收到警告"格式不是字符串文字而没有格式参数" - 如何在提供的代码中更正此问题?

Sos*_*van 6 cocoa

NSLog在以下块的调用中收到警告"格式不是字符串文字而没有格式参数" :

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog([NSString stringWithFormat:@"%d", buttonIndex]);
}
Run Code Online (Sandbox Code Playgroud)

我在这里的另一篇文章中读到这个错误消息表明使用不安全NSLog.有人能指出我正确格式化字符串的方向吗?

all*_*tom 11

从技术上讲,它在您的情况下是一个无效警告,但它告诉您NSLog的格式字符串不是硬编码的,可能是安全性/稳定性问题.修复很简单:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSLog(@"%d", buttonIndex);
}
Run Code Online (Sandbox Code Playgroud)

如果你很好奇,我的意思是安全性/稳定性问题就是这个.在我的示例中,格式字符串NSLog是常量:@"%d",并且您知道在编译它NSLog时期望传递单个整数.当你打电话NSLog一样NSLog([obj makeSomeString]),你真的不知道在编译时的格式字符串是什么,或者有多少/哪种类型的参数应该遵循.如果在运行时字符串结果是"%d %d %@",它将很乐意从堆栈中读取两个整数和一个NSObject,无论是否有任何对象实际放在那里.这是它警告你的问题.

在您的情况下警告无效,因为您生成的字符串格式为%d,因此它永远不应包含%会导致此问题显示的字符.