什么是“找不到实例方法”警告的-Wsomething标志?

时间:2012-11-09 12:44:20

标签: objective-c cocoa warnings clang

我最近有一个案例,有人在init方法中添加了一个参数,并打破了另一个共享代码的项目。由于它只是一个警告,没有人意识到应用程序已被破坏,所以我试图将此警告转变为错误:

warning: instance method '-someMethod' not found (return type defaults to 'id')

我发现你可以将其他C标志中的-Werror = foo传递给Xcode中的编译器,将警告变为错误,但我似乎无法找到'foo'应该是什么。我试过'未声明的选择器',但只捕获@selector案例。我已经尝试过-Werror-implicit-function-declaration,但似乎也没有抓住这种情况。

在偶然搜索巨大的clang源代码时,我发现'warn_inst_method_not_found'后尝试'inst-method-not-found'和'instance-method-not-found'。

帮助......?

更新 以下是您可以编译的示例(例如在CodeRunner中)以查看警告:https://gist.github.com/4045701

1 个答案:

答案 0 :(得分:10)

您正在寻找的选项是-Werror=objc-method-access。如果您下载并编译您发布的要点,Clang会在警告消息中明确告诉您这一点:

% clang test.m -c
test.m:13:21: warning: instance method '-initWithNum:' not found (return type
      defaults to 'id') [-Wobjc-method-access]
  ...theObj = [[MyClass alloc] initWithNum: [NSNumber numberWithInt: 15]];
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.

% clang test.m -Werror=objc-method-access -c  // ta-da!

但在实际情况中,我同意上述所有评论者:您应该修复或禁止所有编译器警告。您的构建应该干净地构建所有时间。否则,正如您正确观察到的那样,您将无法区分真正的错误与“通常的垃圾邮件”。

FWIW,这是我正在使用的Clang版本:

$ clang --version
clang version 3.2  (http://llvm.org/git/llvm 1503aba4a036f5394c7983417bc1e64613b2fc77)
Target: x86_64-apple-darwin12.2.0
Thread model: posix