Вопрос по objective-c, suppress-warnings, compiler-warnings, xcode, llvm – Динамическая пересылка: подавить предупреждение о неполной реализации

39

У меня есть класс, представляющий некоторые методы, реализация которых обеспечивается внутренним объектом.

Я использую прямой вызов для отправки во время выполнения вызовов методов к внутреннему объекту, но XCode жалуется, так как не может найти реализацию объявленных методов.

Я нашел несколько других похожих вопросов по SO, но все они были решены с изменением дизайна.

Я не хочу обсуждать здесь дизайн, но если у кого-то есть какие-то предложения по этому поводу, у меня естьоткрытый вопрос на Code Review, который больше подходит для такого рода обсуждений.

Мой вопрос здесь заключается в том, является ли способ отключитьIncomplete Implementation предупреждение в XCode существует.

Ваш Ответ

2   ответа
26

@interface MyClass (ForwardedMethods)

- (void)doSomething;

@end

(без реализации для категории). Тогда Xcode больше не будет жаловаться на «неполную реализацию».

Спасибо, трюк с неофициальным протоколом работает отлично, я рассмотрю его использование. Gabriele Petronella
Просто хочу добавить, что это называется неформальным протоколом. Nathan Day
Я согласен, и это аккуратное решение, которое я, вероятно, буду использовать. Я принял ответ Popeye, так как это было именно то, что я просил, но мне также нравится решение неформального протокола. Gabriele Petronella
Я не верю, что это работает больше в последнем Xcode. iwasrobbed
@GabrielePetronella: небольшое преимущество использования неофициального протокола может заключаться в том, что он подавляет предупреждения только для методов, которые вы планируете пересылать, а не для всех методов этого класса. Martin R
75

Вы можете подавить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 Руководство пользователя поэтому я подумал, что это будет интересно и полезно всем, у кого еще есть проблемы в этой области.

Я также нашел другой способ, которым вы можете использовать эти#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 Вы можете найтивесь список здесь

@ Тони, это другое предупреждение. Вы получаете это, потому что в протоколе есть обязательный или необязательный метод, который требует реализации, который полностью отличается от того, что это, но я посмотрю и вернусь к вам. Popeye
Нет проблем. Рад, что смог помочь. Popeye
Отлично работает, спасибо. Это именно то, о чем я просил, поэтому я приму ваш ответ. Gabriele Petronella
Возникли проблемы с получением этого на работу. Я все еще получаю предупреждение об этом.Method 'myMethod:' in protocol not implemented. Есть идеи? Tony
Отлично! Спасибо! Иногда люди просто не заткнутся. Сколько раз я могу увидеть одну и ту же рекомендацию "создать категорию"? Да, прагмы, как правило, разрушительны, но это решает множество проблем, особенно когда речь идет об Objective C. Leo Natan

Похожие вопросы