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

CVe*_*tex 7 xcode gcc warnings objective-c

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

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

NSString* title = @"";
if ([view respondsToSelector:@selector(title)]) {
  title = [view title];
}
Run Code Online (Sandbox Code Playgroud)

在一些谷歌搜索之后,我尝试通过包装该代码区来禁用代码块的警告

#pragma warning disable
// my code
#pragma warning restore
Run Code Online (Sandbox Code Playgroud)

没工作:(

有人知道如何在Xcode中执行此操作吗?

任何帮助表示赞赏.

-简历

Ind*_*ore 11

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow-ivar"
// your code
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

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


编辑

对于铿锵你可以使用

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"
// your code
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)


Wil*_*and 2

您可以在这里做很多事情,但最简单的可能只是稍微重写您的代码。

NSString* title = @"";

if ([view respondsToSelector:@selector(title)]) {
  title = [(id)view title];
}
Run Code Online (Sandbox Code Playgroud)

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

另外一个选择:

NSString* title = @"";

if ([view respondsToSelector:@selector(title)]) {
  title = [view performSelector:@selector(title)];
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:我知道这些方法实际上都不会在任何时间内关闭警告,而是会抑制它们。

至少,如果做得正确的话,抑制通常比简单地忽视要好。

  • @CVertex:不,我很确定修复你的警告才是你真正想要的。 (3认同)