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

Jam*_*sev 7 syntax objective-c error-checking

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

NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@",
                         [randomAjectiveList objectAtIndex:ajectiveIndex],
                         [randomNounList objectAtIndex:nounIndex]];
Run Code Online (Sandbox Code Playgroud)

当然,来考虑它,我有一个太多" %@"到位,一个更实际的论点.正确的代码应如下所示

NSString *randomName = [NSString stringWithFormat:@"%@, %@",
                        [randomAjectiveList objectAtIndex:ajectiveIndex],
                        [randomNounList objectAtIndex:nounIndex]];
Run Code Online (Sandbox Code Playgroud)

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

请指教.

Tom*_*mmy 8

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

[NSString stringWithFormat:@"%d %@ %@"];
NSLog(@"%d %@ %@");
Run Code Online (Sandbox Code Playgroud)

在NSLog上生成"比'数据参数"更多'%'转换的警告,但未对NSString发表评论.

因此,差异可能是固定功能调用与动态调用.编译器实际上无法完全确定NSString调用将在何处进行,因为您可能已经声明了类别或使用低级运行时在运行时调整NSString选择器表.

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