Xcode看着这条线并没有抱怨。项目构建,代码在运行时崩溃。
NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@",
[randomAjectiveList objectAtIndex:ajectiveIndex],
[randomNounList objectAtIndex:nounIndex]];
当然,考虑一下,我有一个太多的“%@
”,一个实际的论点。正确的代码应如下所示
NSString *randomName = [NSString stringWithFormat:@"%@, %@",
[randomAjectiveList objectAtIndex:ajectiveIndex],
[randomNounList objectAtIndex:nounIndex]];
我问你,但为什么Xcode没有抱怨?看起来像param计数器这样显而易见的事情。不应该在编译时检查这个吗?它可能是“%@
”特有的吗?
请告知。
答案 0 :(得分:8)
基于快速检查,您是100%正确的,在编译时不会检查,即使是静态分析器也是如此。相反,检查NSLog。所以在我的机器上,使用XCode 4.0.2,以下内容:
[NSString stringWithFormat:@"%d %@ %@"];
NSLog(@"%d %@ %@");
在NSLog上生成“比'数据参数”更多'%'次转换的警告,但无法对NSString发表评论。
因此,差异可能是固定功能调用与动态调用。编译器实际上无法完全确定NSString调用的位置,因为您可能已经声明了一个类别,或者使用了低级运行时来在运行时调整NSString选择器表。
但是,特别是如果你开始修改基础课程的行为,你几乎会立即遇到这些问题,就像你一样,我预计至少会有一个警告。