如何临时禁用Objective-C源文件中的警告?

7

我参与的一个项目有一个构建系统,强制不允许出现警告。

但是我的一些代码需要警告才能正常工作。以下是一个例子:

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

经过一些搜索,我尝试通过将代码块包裹在以下内容中来禁用警告:

#pragma warning disable
// my code
#pragma warning restore

没成功 :(

有人知道在Xcode中如何做到这一点吗?

任何帮助都将不胜感激。

-CV


可能是重复的 https://dev59.com/pnVC5IYBdhLWcg3wvT_g - AndersK
3个回答

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

你可以在这里学习有关GCC pragma的知识,如果想获取警告代码,请前往日志导航器(Command+7),选择最顶部的构建,展开日志(右侧的'='按钮),并向下滚动到底部,那里的警告代码将被放在方括号中,像这样[-Wshadow-ivar]


编辑

对于clang,您可以使用

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

刚刚搜索了一下,发现了我一年半前找的答案 :) - Inder Kumar Rathore
在XCode 9.2中,快捷键是Command+9。右边的“=”符号有5条水平平行线。 - Doug Voss

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的方法; 但它更冗长一些。

编辑:我知道这两种方法都没有真正关闭警告,而是将其抑制。

抑制,如果做得正确,通常比简单地忽略要好。


谢谢,那会起作用。但我的代码实际上是我所有警告中的一个示例。#pragma warning disable 是我想要的。 - CVertex
3
@CVertex:不,我非常确定你真正想做的是解决你的警告问题。 - Williham Totland
最好修复你的代码,不要在任何地方生成警告。总有办法解决,而且真的值得这样做。 - Nick Moore

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接