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 вы присваиваете значение там... используйте "==" вместо "=" ...
спасибо.....