我最近有一个案例,有人在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
答案 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