XCode 4 if (self = [super init]) проблема

Я недавно (например, только сейчас) обновился до XCode 4, и в целом он мне нравится, однако есть одна вещь, которая меня раздражает.

Когда я пишу код, как это:

 if (self = [super init])
 {
      ...
 }

Это дает мне "проблему": Using the result of an assignment as a condition without parentheses

Как я могу подавить это предупреждение, поскольку оно подчеркивает весь текст красным, заставляя меня думать, что есть критическая ошибка. Поскольку я несколько опытный программист Objective-C, я действительно не хочу менять свои методы и добавлять дополнительные скобки вокруг моих утверждений init.

8 ответов

Решение

Вы можете добавить дополнительный набор скобок в оператор if

if ((self = [super init])) {
    ...
}

Или вы можете сделать как новые шаблоны.

self = [super init];
if(self) {
    ...
}

Вы можете снять флажок "Отсутствующие скобки и скобки" в настройках сборки (в разделе "Предупреждения GCC 4.2", если вы используете GCC4.2 или LLVM GCC4.2).

Это эквивалентно ответу, связанному с aeprius, который работает с LLVM 2.0, но не с GCC 4.2 (протестировано).

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

Как отметил здесь Бавариус, if(self=[super init]){...} идиоматичен в Objective-C. Предупреждение было отключено по умолчанию. В XCode 3.x может показаться, что перенесенные проекты автоматически получают "новое значение по умолчанию"; Жаль получать все эти предупреждения о перенесенных проектах.

По крайней мере, отмена предупреждения не сделает кодирование менее безопасным, чем это было в XCode 3.x.

Я нашел ответ на этот вопрос здесь: if (self = [super init]) - предупреждение LLVM! Как вы справляетесь с этим?

Что предписывает добавить флаг "-Wno-idiomatic-круглые скобки" в настройках здания. Который сделал трюк для меня.

Двойные скобки это.

if ((self = [super init]))

Это просто убедиться, что вы действительно знаете, что делаете.

Я не уверен, есть ли способ заставить замолчать фактическое предупреждение в XC4, так как это не предупреждение компилятора.

Замените его на if((self = [super init])), это показывает компилятору, что он намеренный.

Вы можете либо поставить другой набор паренов вокруг self = [super init], либо вы можете установить self перед условным, а затем оценить как будто (self).

Я обычно делаю это.

self = [super init];

if (self) {

}

Таким образом, ничто и никто никогда не будет смущен.

Используйте if(self == [self init])....., так как вы используете оператор присваивания " = " вместо условия.... оператор if проверяет условие.... n вы присваиваете значение там... используйте "==" вместо "=" ...

спасибо.....

Другие вопросы по тегам