objective-c - 代码。关于语法错误检查的问题

标签 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 没有提示?似乎与参数计数器有关是一件显而易见的事情。这不应该在编译时检查吗?也许它特定于“%@”?

请指教。

最佳答案

根据快速检查,您是 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/

相关文章:

TableView 导航栏上的 IOS 按钮不起作用

scala - 在 Scala 中将函数参数定义为 "var"?

Java 验证日期条目

javascript - 在 className if-else 语法中 react JSX

emacs - 我怎样才能发现细微的 Lisp 语法错误?

java - Java : S to Start and Q to Quit中的错误检查

C. 检查特定小数位数的 float 输入

ios - 在 Objective-C 中用 %20 替换空格

ios - MPNowPlayingInfoCenter Remote 在 iOS 10 中响应不正确

ios - 使用 AVAudioPlayer 从互联网播放音频