Dynamic forwarding: suppress Incomplete Implementa

2019-01-07 06:06发布

问题:

I have a class exposing some methods, whose implementation is provided by an inner object.

I'm using forward invocation to dispatch at runtime the method calls to the inner object, but XCode is complaining since it cannot find an implementation of the declared methods.

I found some other similar questions on SO, but all of them were solved with a design change.

I don't mean to have a discussion about the design here, but if anybody has some suggestion about it I have an open question on Code Review, which is more suitable for such kind of discussions.

My question is here is whether a method to turn off the Incomplete Implementation warning in XCode exists.

回答1:

You can suppress Incomplete Implementation warnings by adding

  #pragma clang diagnostic ignored "-Wincomplete-implementation"

just above the @implementation

Hope this helps

EDIT

After being told in the comments that this didn't work for someone and finding out the reason was because it was a different warning they were getting I have done a bit of playing around and been able to solve there issue to so I thought I would update this answer to include theirs and for GCC ignores as well. So for the issue for @Tony the following should work

  #pragma clang diagnostic ignored "-Wprotocol"

For anyone wanting to know the GCC compiler version it is

  #pragma GCC diagnostic ignored "-Wprotocol"

  #pragma GCC diagnostic ignored "-Wincomplete-implementation"

I will also make a point that all these diagnotstic ignores can also be done by specifying the setting on a per file basis by going to XCODE Project >> Target >> Build Phases >> Compile Sources and adding a compiler-flag so you would just add -Wprotocol or Wincomplete-implementation or whatever compiler-flag you needed.

Hope this update helps all if anymore need I will update my answer to include.

EDIT 2

I was doing a bit more digging around about this an came across the Clang Compliler User's Manual so I thought that this would be interesting and helpful to anyone having issues around this area still.

I have also found another way that you can use these #pragma diagnostic ignores and that is you can push and pop them so if you wanted to just ignore a particular section of the file and not all of it then you could do the following

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

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

    #pragma clang diagnostic pop

Remember that all these #pragma compile ignores can be used with GCC as well so the above would

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

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

    #pragma GCC diagnostic pop

The push and pop seem to work with all the diagnostic ignores I have tried so far.

Another one is

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

The one for suppressing unused variables is

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

and the GCC version being

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

A few more for ignoring warnings from unavailableInDeploymentTarget

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

and performSelector leaks

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

and deprecated declarations

    #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

Thanks to DanSkeel you can find the entire list here



回答2:

You can declare the methods in a class category interface:

@interface MyClass (ForwardedMethods)

- (void)doSomething;

@end

(without an implementation for the category). Then Xcode will not complain about "incomplete implementation" anymore.