动态转发:抑制不完整实施警告

问题描述 投票:0回答:2

我有一个类公开了一些方法,其实现由内部对象提供。

我使用前向调用在运行时将方法调用分派到内部对象,但 XCode 会抱怨,因为它找不到所声明方法的实现。

我在 SO 上发现了一些其他类似的问题,但所有这些问题都通过设计更改得到了解决。

我并不是想在这里讨论设计,但如果有人对此有一些建议,我有一个关于代码审查的开放式问题,这更适合此类讨论。

我的问题是是否存在关闭 XCode 中的

Incomplete Implementation
警告的方法。

objective-c xcode llvm compiler-warnings suppress-warnings
2个回答
79
投票

您可以通过添加

来抑制
Incomplete Implementation

警告
  #pragma clang diagnostic ignored "-Wincomplete-implementation"
  

就在

@implementation

上方

希望这有帮助

编辑

在评论中被告知这对某人不起作用并发现原因是因为这是他们收到的不同警告之后,我做了一些尝试并能够解决该问题,所以我想我会更新这个答案以包括他们的答案,并且

GCC
也会忽略。因此,对于
@Tony
的问题,以下应该有效

  #pragma clang diagnostic ignored "-Wprotocol"

对于任何想了解

GCC
编译器版本的人来说,它是

  #pragma GCC diagnostic ignored "-Wprotocol"

  #pragma GCC diagnostic ignored "-Wincomplete-implementation"

我还将指出,所有这些

diagnotstic ignores
也可以通过转到
XCODE Project >> Target >> Build Phases >> Compile Sources
并添加编译器标志来指定每个文件的设置来完成,这样您只需添加
-Wprotocol
Wincomplete-implementation
或您需要的任何编译器标志。

希望此更新对所有人有所帮助,如果需要的话我会更新我的答案以包括在内。

编辑2

我对此进行了更多的挖掘,并发现了Clang编译器用户手册,所以我认为这对于仍然在该领域遇到问题的任何人来说都是有趣且有帮助的。

我还找到了另一种方法,你可以使用这些

#pragma diagnostic ignores
,那就是你可以
push
pop
它们,所以如果你想忽略文件的特定部分而不是全部,那么你可以这样做以下

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wmultichar"

    // And pop the warning is gone.
    char b = 'fa';

    #pragma clang diagnostic pop

请记住,所有这些

#pragma
编译忽略也可以与
GCC
一起使用,因此上面的内容

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wmultichar"

    // And pop the warning is gone.
    char b = 'fa';

    #pragma GCC diagnostic pop

push
pop
似乎可以与我迄今为止尝试过的所有
diagnostic ignores
配合使用。

还有一个是

    #pragma clang diagnostic ignored "UnresolvedMessage"
    #pragma GCC diagnostic ignored "UnresolvedMessage"

抑制未使用变量的方法是

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wunused-variable"
        NSString *myUnusedVariable;
    #pragma clang diagnostic pop

GCC 版本是

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-variable"
        NSString *myUnusedVariable;
    #pragma GCC diagnostic pop

还有一些忽略来自 unavailableInDeploymentTarget 的警告

    #pragma clang diagnostic push
    #pragma ide diagnostic ignored "UnavailableInDeploymentTarget"
        leftEdge.barTintColor = rightEdge.barTintColor = self.toolbar.barTintColor;
    #pragma clang diagnostic pop

和执行选择器泄漏

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    [target performSelector:cancelAction withObject:origin];
    #pragma clang diagnostic pop

和已弃用的声明

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
        button = [[UIBarButtonItem alloc] initWithTitle:buttonTitle style:UIBarButtonItemStyleBordered target:self action:@selector(customButtonPressed:)];
    #pragma clang diagnostic pop

感谢

DanSkeel
,您可以在这里找到整个列表


26
投票

您可以在类类别接口中声明方法:

@interface MyClass (ForwardedMethods)

- (void)doSomething;

@end

(没有该类别的实现)。那么 Xcode 就不会再抱怨“不完整的实现”了。

© www.soinside.com 2019 - 2024. All rights reserved.