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

7

Xcode没有对这行代码进行任何抱怨。项目构建成功,但在运行时代码崩溃了。

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

自然而然地,仔细想想,我在代码中放置了一个太多的“%@”,比实际参数多一个。正确的代码应该如下所示。
NSString *randomName = [NSString stringWithFormat:@"%@, %@",
                        [randomAjectiveList objectAtIndex:ajectiveIndex],
                        [randomNounList objectAtIndex:nounIndex]];

我想问一下...为什么Xcode没有抱怨呢?看起来参数计数是一个显而易见的事情。这不应该在编译时检查吗?也许这是特定于"%@"的问题吗?
请给予建议。
1个回答

8

根据快速检查,您是100%正确的,这在编译时没有被检查,甚至静态分析器也没有检查。相反,NSLog是经过检查的。因此,在我的机器上,使用XCode 4.0.2,以下内容:

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

在NSLog中出现“More '%' conversions than data arguments”的警告,但未对NSString进行注释。

因此,区别可能是固定函数调用与动态调用。编译器实际上无法完全确定NSString调用将去哪里,因为您可能已声明了一个类别或使用低级运行时在运行时调整NSString选择器表。

然而,特别是考虑到如果您开始修改Foundation类的行为,您几乎立即会遇到的问题,像您一样,我至少希望有一个警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接