2009-08-03 2 views
2

, например, невозможно реализовать методы делегирования без создания предупреждений. Это действительно не имеет смысла, потому что:Можно ли подавить предупреждения компилятора для определенных задач?

 if (self.myDelegate != nil) { 
      BOOL callDelegate = [self.myDelegate respondsToSelector:@selector(fooDidHappen:WithBar:)]; 
      if (callDelegate) { 
       [self.myDelegate fooDidHappen:foo withBar:bar]; 
      } 
     } 

Как вы можете видеть, я спрашиваю, отвечает ли делегат на этот селектор. Но в if-блоке, который вводится только тогда, когда делегат отвечает на него, я получаю глупое предупреждение о том, что делегат не отвечает. Конечно, этого не происходит, потому что этот код в полной мере используется во время исполнения. Однако очень трудно продолжать работу с предупреждениями компилятора в xcode, поэтому я хотел бы сказать компилятору, чтобы просто игнорировать это.

В PHP, например, вы можете написать @anFunction (foo); и @ будет убедиться, что эта функция вообще не дает вам никакого предупреждения. Так есть ли директива или команда компилятора, которые могут быть напечатаны вокруг этой части, чтобы избавиться от предупреждения?

+0

Это старший из двух повторяющихся вопросов. –

ответ

6

В другом question люди сказали вам, как исправить это предупреждение, вы объявляете формальный протокол для делегата и добавляете этот протокол в объявление свойства делегата.

Сказав, что, если вы хотите, чтобы подавить предупреждение, вы можете использовать GCC диагностики прагму:

//Turn the warning off 
#pragma GCC diagnostic ignored "-Wundeclared-selector" 
if (self.myDelegate != nil) { 
    BOOL callDelegate = [self.myDelegate respondsToSelector:@selector(fooDidHappen:WithBar:)]; 
    if (callDelegate) { 
    [self.myDelegate fooDidHappen:foo withBar:bar]; 
    } 
} 

//Turn the warning back on 
#pragma GCC diagnostic warning "-Wundeclared-selector" 

Примечание это требует GCC 4.2.1+ или Clang (и лязг имеет то, что я чувствую это improved но я могу быть предвзятым, так как я написал для него патч).

+0

Это на самом деле не всегда будет работать. Компилятор должен знать тип аргументов, чтобы иметь возможность правильно компилировать вызов метода. – bbum

+0

Ну, он должен просто исправить проблему, поэтому я связался с другим сообщением. Я предполагаю, что компилятор просто называет «v @: @@», рассматривая типы аргументов. Это может быть неправильно, что вызывает ошибку времени выполнения, но вы всегда можете подавить предупреждение, это просто не очень хорошая идея ;-) –

0

Для первоначального вопроса о том, как подавить определенные предупреждения, есть файл Xconfig, что я думаю, что будет делать это, хотя я не нашел какой-либо конкретной документации (не выглядела достаточно сложно).

Смежные вопросы