Xcode 看着这一行并没有提示。项目已构建,代码在运行时崩溃。
NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@",
[randomAjectiveList objectAtIndex:ajectiveIndex],
[randomNounList objectAtIndex:nounIndex]];
当然,想想看,我有太多的“%@
”,比实际参数多一个。正确的代码应该如下所示
NSString *randomName = [NSString stringWithFormat:@"%@, %@",
[randomAjectiveList objectAtIndex:ajectiveIndex],
[randomNounList objectAtIndex:nounIndex]];
虽然我问你......为什么 Xcode 没有提示?似乎与参数计数器有关是一件显而易见的事情。这不应该在编译时检查吗?也许它特定于“%@
”?
请指教。
最佳答案
根据快速检查,您是 100% 正确的,这在编译时没有检查,似乎甚至由静态分析器检查。相反,检查 NSLog。所以在我的机器上,使用 XCode 4.0.2,如下:
[NSString stringWithFormat:@"%d %@ %@"];
NSLog(@"%d %@ %@");
在 NSLog 上生成“'%' 转换多于数据参数”的警告,但无法对 NSString 发表评论。
因此,区别可能在于固定函数调用与动态调用。编译器实际上不能完全确定 NSString 调用的去向,因为您可能已经声明了一个类别或使用低级运行时在运行时调整 NSString 选择器表。
但是,特别是考虑到如果您开始修改 Foundation 类的行为,您几乎会立即遇到的问题,就像您一样,我至少会收到警告。
关于objective-c - 代码。关于语法错误检查的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6576337/