Xcode中。关于语法错误检查的问题

时间:2011-07-04 21:50:37

标签: objective-c syntax error-checking

Xcode看着这条线并没有抱怨。项目构建,代码在运行时崩溃。

NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@",
                         [randomAjectiveList objectAtIndex:ajectiveIndex],
                         [randomNounList objectAtIndex:nounIndex]];

当然,考虑一下,我有一个太多的“%@”,一个实际的论点。正确的代码应如下所示

NSString *randomName = [NSString stringWithFormat:@"%@, %@",
                        [randomAjectiveList objectAtIndex:ajectiveIndex],
                        [randomNounList objectAtIndex:nounIndex]];

我问你,但为什么Xcode没有抱怨?看起来像param计数器这样显而易见的事情。不应该在编译时检查这个吗?它可能是“%@”特有的吗?

请告知。

1 个答案:

答案 0 :(得分:8)

基于快速检查,您是100%正确的,在编译时不会检查,即使是静态分析器也是如此。相反,检查NSLog。所以在我的机器上,使用XCode 4.0.2,以下内容:

[NSString stringWithFormat:@"%d %@ %@"];
NSLog(@"%d %@ %@");

在NSLog上生成“比'数据参数”更多'%'次转换的警告,但无法对NSString发表评论。

因此,差异可能是固定功能调用与动态调用。编译器实际上无法完全确定NSString调用的位置,因为您可能已经声明了一个类别,或者使用了低级运行时来在运行时调整NSString选择器表。

但是,特别是如果你开始修改基础课程的行为,你几乎会立即遇到这些问题,就像你一样,我预计至少会有一个警告。