我工作的一个项目有一个不强制执行警告的构建系统。
但我有一些代码需要警告才能工作。这是一个例子
NSString* title = @"";
if ([view respondsToSelector:@selector(title)]) {
title = [view title];
}
在一些谷歌搜索之后,我尝试通过用
包装该代码区来禁用代码块的警告#pragma warning disable
// my code
#pragma warning restore
无效:(
任何人都知道如何在Xcode中执行此操作?
感谢任何帮助。
-CV
答案 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 pragma。 See this question for details