【问题标题】:Is it possible to suppress compiler warnings for specific tasks?是否可以抑制特定任务的编译器警告?
【发布时间】:2011-03-26 22:56:28
【问题描述】:

例如,在不产生警告的情况下实施委托技术似乎是不可能的。这真的没有意义,因为:

        if (self.myDelegate != nil) {
            BOOL callDelegate = [self.myDelegate respondsToSelector:@selector(fooDidHappen:WithBar:)];
            if (callDelegate) {
                [self.myDelegate fooDidHappen:foo withBar:bar];
            }
        }

如您所见,我询问代理是否响应了该选择器。但是在仅当代表响应它时输入的 if 块中,我收到一个愚蠢的警告,即代表没有响应。当然不是,因为这段代码只在运行时充分利用。然而,在 xcode 中继续处理编译器警告是非常糟糕的做法,所以我想告诉编译器忽略它。

以 PHP 为例,您可以编写 @anFunction(foo); @ 将确保这个函数根本不会给你任何警告。那么是否可以在该部分周围键入编译器指令或命令以消除警告?

【问题讨论】:

  • 这是两个重复问题中较老的一个。

标签: iphone xcode


【解决方案1】:

在另一个question 中,人们确切地告诉了您如何修复该警告,您为委托声明了一个正式协议并将该协议添加到委托的属性声明中。

话虽如此,如果你想抑制警告,你可以使用 GCC 诊断编译指示:

//Turn the warning off
#pragma GCC diagnostic ignored "-Wundeclared-selector"
if (self.myDelegate != nil) {
  BOOL callDelegate = [self.myDelegate respondsToSelector:@selector(fooDidHappen:WithBar:)];
  if (callDelegate) {
    [self.myDelegate fooDidHappen:foo withBar:bar];
  }
}

//Turn the warning back on
#pragma GCC diagnostic warning "-Wundeclared-selector"

请注意,这需要 GCC 4.2.1+ 或 CLANG(我觉得 clang 有一个 improved 版本,但由于我为它编写了补丁,所以我可能有偏见)。

【讨论】:

  • 这实际上并不总是有效。编译器需要知道参数的类型才能正确编译方法调用本身。
  • 好吧,他应该解决这个问题,这就是我链接回另一篇文章的原因。我假设编译器只是通过查看参数的类型来推断“v@:@@”。导致运行时错误可能是错误的,但您始终可以抑制警告,这不是一个好主意;-)
【解决方案2】:

对于如何抑制特定警告的原始问题,我认为会执行此操作的 xconfig 文件,尽管我还没有找到任何特定的文档(还不够努力) .

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2011-08-13
    • 2015-10-22
    • 2019-04-19
    相关资源
    最近更新 更多