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

45

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

我使用前向调用来将方法调用在运行时分派到内部对象,但XCode投诉说它找不到已声明方法的实现。

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

我并不想在这里讨论设计,但如果有人对此有建议,我在Code Review上有一个开放式问题,更适合这种类型的讨论。

我的问题是这里是否存在一种方法来关闭XCode中的Incomplete Implementation警告。

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"

我还要强调一点,通过在XCODE 项目>>目标>>构建阶段>>编译源代码中指定设置,也可以针对每个文件进行所有这些diagnotstic ignores,并添加一个编译器标志,例如-WprotocolWincomplete-implementation或其他所需的编译器标志。

希望此更新对所有人有所帮助,如果需要更多信息,我会更新我的答案。

编辑 2

我对此进行了更深入的研究,并找到了Clang Compiler 用户手册,因此我认为这对于仍然在这个领域遇到问题的任何人都是有趣和有用的。

我还发现了另一种使用这些#pragma diagnostic ignores的方法,即您可以将它们pushpop,因此如果您只想忽略文件的特定部分而不是整个文件,则可以执行以下操作

    #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

pushpop 看起来可以与我迄今为止尝试的所有 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

并且performSelector泄漏

    #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,您可以在此找到完整列表


非常好,谢谢。这正是我所要求的,我会接受你的答案。 - Gabriele Petronella
还有一个问题,是否可能仅针对特定协议抑制警告? - Tony
@Tony 我不确定我能够查看。使用哪个协议? - Popeye
例如,只禁止 UITableViewDelegate 协议,而不禁止 UITableViewDataSource 协议。 - Tony
如果你想知道在哪里找到所有警告列表,请参考。 - DanSkeel
显示剩余5条评论

26

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

@interface MyClass (ForwardedMethods)

- (void)doSomething;

@end

(没有实现该类别的实现方式)。然后Xcode就不会再抱怨“不完整的实现”了。


2
@GabrielePetronella:使用非正式协议的一个小优点可能是它仅抑制您计划转发的方法的警告,而不是该类的所有方法的警告。 - Martin R
我不相信这在最新的Xcode中还能工作。 - iwasrobbed
@iWasRobbed:我已经再次使用Xcode 6.4和Xcode 7(beta 2)进行了检查,它仍然可以工作。 - Martin R
@MartinR 感谢您的检查!我无法在不使用#pragma抑制的情况下完成这个任务,因为它是针对我拥有的一个类别的。 :( - iwasrobbed
我使用了相同的技巧,并在顶部添加了一条注释,解释为什么实现不存在。有些人试图“修复”缺失的实现... - Ayush Goel
显示剩余3条评论

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