45

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

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

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

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

我的问题是这里是否存在关闭Incomplete ImplementationXCode 中警告的方法。

4

2 回答 2

78

您可以通过添加来禁止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 Compliler User's Manual,所以我认为这对在该领域仍有问题的任何人都会很有趣和有帮助。

我还找到了另一种可以使用它们的方法#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你可以在这里找到整个列表

于 2013-01-21T18:02:20.080 回答
26

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

@interface MyClass (ForwardedMethods)

- (void)doSomething;

@end

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

于 2013-01-21T17:52:12.903 回答