【问题标题】:Make Xcode 4.3 warn about undeclared methods that exist in the current @implementation使 Xcode 4.3 对当前 @implementation 中存在的未声明方法发出警告
【发布时间】:2012-03-22 13:42:03
【问题描述】:

当当前 @implementation 中存在未声明的方法时,Xcode 4.3 不会发出警告,这是一个很棒的新功能。但是,当在 Xcode 4.2 上使用我的项目时,这在某些情况下会导致问题。

如何重新启用未声明方法的警告?

例如:

@interface MashTun : NSObject
- (void)foo;
@end

@implementation MashTun
- (void)foo {
    CGRect rect = [self smallRect];
    NSLog(@"My Small Rect: %@", NSStringFromCGRect(rect));
}

- (CGRect)smallRect {
    return CGRectMake(0, 0, 100, 100);
}
@end

在 Xcode 4.2 中,这会失败:

warning: instance method '-smallRect' not found (return type defaults to 'id')
error: initializing 'CGRect' (aka 'struct CGRect') with an expression of incompatible type 'id' 

我完全理解 Xcode 4.2 中的警告和错误,因为它不允许在当前 @implementation 范围内搜索方法。 (修复很简单:要么将smallRect 方法放在foo 方法之上,要么在类别或标题中声明smallRect 方法。)

但是如何在 Xcode 4.3 中打开警告以在将其传递给运行 4.2 的同事之前捕获此错误?

【问题讨论】:

  • 我还没有安装 4.3 但Build Settings 下还有Undeclared Selector 的选项吗?这有什么影响吗?
  • 你会这么认为——但那是指使用 @selector(foo) 以及它是否使用该名称检查现有方法。
  • 是的,这是 4.3 的一大进步,但同时也有点麻烦。它经常灼伤我。好消息是问题很快就会随着每个人的升级而消失(我们终于可以停止不必要地预先声明方法)。
  • @RobNapier 有没有办法在 4.3 中成功使用 4.2 中相同版本的 LLVM?
  • 几乎可以肯定。我通过大量符号链接使用旧的 gcc-4.0 和 10.4 SDK for PPC 构建。但是对于您的情况,没有理由这样做。下载 4.2 Xcode 并将其安装在不同的目录中,然后运行它。我同时安装了 Xcode 3、Xcode 4.2 和 Xcode 4.3。

标签: objective-c xcode clang compiler-warnings method-declaration


【解决方案1】:

在这种转换过程中,一个选项是与另一个编译器/版本交叉编译。 gcc-llvm 是一种常见的预安装替代方案。另一种方法是安装多个版本的 xcode 并使用该工具链进行构建。

【讨论】:

  • 是的,基于应用程序的 Xcode 现在让这一切变得简单。在这种情况下,解决方案是将我们的构建服务器升级到 Lion,并在所有站点上使用 4.3。不是我正在寻找的解决方案(编译器警告标志),但它最终奏效了。
【解决方案2】:

我不知道我是否有一个有趣的构建,但我的 LLVM 3.1 编译器在编译器警告下确实有未声明的选择器标志。目前正在运行 4.3.2。不过 LLVM 4.0 没有。

【讨论】:

  • 未声明的选择器很棒!但不完全是我在说什么。未声明的选择器所做的是确保当您执行 @selector(foo:) 时选择器是有效的(在编译时)。它已关闭,因为您可能在运行时拥有动态选择器。
【解决方案3】:

新的 LLVM 3.1 编译器不关心这个。将方法放在上方/下方或是否有原型都没有关系。因此,如果您所有的同事都将他们的 Xcode 更新到至少 4.3。这真的不应该是一个问题。

另一种选择是使用以下代码创建您自己的警告。你冷冷地告诉他们这个问题,以及手头的问题。这可能是传达信息的一种简单方法。

#warning "warning message"

希望这会有所帮助。

【讨论】:

  • 谢谢,我知道 LLVM 3.1 没有警告这些,我的同事可以升级。目前这是不可能的。我想在将项目交给他们之前自己看看这些警告。手动创建错误会假设我可以在 4.3 中看到警告——我看不到。是否有编译器设置可以恢复到旧行为?
  • 您可以浏览所有警告,我有这些警告,但没有,这就是我建议上述内容的原因。
  • 之前的回复中提到,您可以检查所有编译器警告设置,但没有相应的标志。所以这是不可能的,要么降级到 Xcode 4.2,要么确保你编写的所有代码,对于每个自定义方法都有一个原型,无论如何这是一个好习惯。
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多