如何临时禁用目标c源文件中的警告?

时间:2011-03-03 13:02:53

标签: objective-c xcode gcc warnings

我工作的一个项目有一个不强制执行警告的构建系统。

但我有一些代码需要警告才能工作。这是一个例子

NSString* title = @"";
if ([view respondsToSelector:@selector(title)]) {
  title = [view title];
}

在一些谷歌搜索之后,我尝试通过用

包装该代码区来禁用代码块的警告
#pragma warning disable
// my code
#pragma warning restore

无效:(

任何人都知道如何在Xcode中执行此操作?

感谢任何帮助。

-CV

3 个答案:

答案 0 :(得分:11)

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop

您可以了解GCC pragma here并获取警告的警告代码进入Log Navigator(Command + 7),选择最顶层的构建,展开日志(右侧的'='按钮) ,并滚动到底部,警告代码在方括号内,如[-Wshadow-ivar]


修改

对于clang,您可以使用

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop

答案 1 :(得分:2)

你可以在这里做很多事情,但最简单的可能就是重写你的代码。

NSString* title = @"";

if ([view respondsToSelector:@selector(title)]) {
  title = [(id)view title];
}

在发送消息之前将视图变量强制转换为id应该确保只要名为-title的方法存在于任何地方,它就会保持沉默。

另一种选择:

NSString* title = @"";

if ([view respondsToSelector:@selector(title)]) {
  title = [view performSelector:@selector(title)];
}

这与上面的有点不同,因为它不需要文件“看到”任何名为title的方法;但它有点罗嗦。

编辑:我知道这些方法实际上都没有在任何时间内发出警告,而是压制它们。

如果正确完成,压制通常比简单地忽略更好。

答案 2 :(得分:1)

最接近你想要的方法是使用GCC diagnostic pragmaSee this question for details