Как отключить локальную декларацию "foo" скрывает переменную экземпляра?

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

Ответ 1

Имя предупреждения, которое вы ищете, это "shadow- ivar". Он появляется в журнале Xcode 4.3 как нечто вроде warning: local declaration of 'foo' hides instance variable [-Wshadow-ivar].

Я все еще не вижу его в списке Build Settings, но #pragma clang diagnostic ignored "-Wshadow-ivar" позаботится об этом в одном файле за раз. Я действительно хочу отключить его для определенных функций, а затем снова включить его. Таким образом, он перестает называть меня, где я решил, что мне все равно, но снова предупредит меня в новом коде.

Ответ 2

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

Для справки в будущем вы можете найти этот идентификатор предупреждения, перейдя в "Навигатор журнала", нажав на самую последнюю сборку, где появилось предупреждение, свернув в журнал, чтобы найти точку, в которой появляется задача "скомпилировать" восклицательный знак и нажмите кнопку "подробнее", которая выглядит как серая выноска с 5 горизонтальными линиями. Вы увидите подробные сведения о предупреждениях/ошибках, и если появится идентификатор предупреждения, он появится в строке с подробным предупреждением желтым цветом. По крайней мере, это то, что мне рассказал один из инженеров-компиляторов в Apple. Мне еще нужно увидеть предупреждение о том, что я действительно хочу отключить отображение идентификатора в журнале.

Скачайте файл bugreport с Apple, сообщите им, что вы хотите больше параметров для отключения предупреждений в XCode и укажите это конкретно.

Ответ 3

В Xcode 4.4 это можно отключить, перейдя к настройке сборки "Другие предупреждающие флаги" и установив значение "-Wno- shadow- ivar"

Ответ 4

NSString *foo;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow-ivar"

- (void)myFunctionWithShadow_ivarWarningsIgnored {

    NSString *foo = @"...";
    NSLog(@"This shouldn't get a warning %@", foo);

}

#pragma clang diagnostic pop

- (void)myFunctionWithShadow_ivarWarningsNotIgnored {

    NSString *foo = @"...";
    NSLog(@"and this should %@", foo);

}

Удачи!:)

Ответ 5

Обновление для Xcode 8.3 - Ошибка в компиляторах "Декларация затеняет локальную переменную" в некоторых случаях, когда она преднамеренно... и паники нянь.

Например, в Objective C:

Учитывая

typedef BOOL ( ^BoolBoolBlock ) ( BOOL );

И характер Apple Blocks сделает любую переменную, объявленную в непосредственной внешней области, блоком, глобальным для блока (псевдо-глобальными). Это приводит к предупреждениям (и ошибкам, если предупреждения == ошибки в ваших настройках) в строке BOOL theResult = false;:

- (BoolBoolBlock) boolBoolBlock {
    BoolBoolBlock    theResult = nil;

    theResult = ^BOOL ( unused BOOL is ) {
        BOOL    theResult = false; // hides (shadows) the outer theResult (a good thing)

        /*
         call back code goes here,
         all variables local in scope to this method are global to the block so be careful
         */
        return theResult;
    };

    return theResult;
}

няня видит, что BoolBoolBlock theResult = nil; получает shadow- заблокирован BOOL theResult = false;, который на самом деле намерен по двум причинам в этом случае:

  • по соглашению в моем коде ВСЕ возвращаемые значения - это результат независимо от того, что
  • является положительным побочным эффектом, потому что я морально против глобальных переменных.

Другими словами, вся эта конструкция предназначена для блокировки псевдо-глобальных механизмов Apple Blocks и создания структуры в этом хаосе. Блокировка метода "theResult" от использования в блоке, который возвращает метод, - это хорошо... но у няни есть своеобразное соответствие.

Чтобы успокоить няню (избавьтесь от предупреждений или, возможно, ошибок, если у вас есть дисциплина, чтобы устанавливать предупреждения как ошибки), вы просто изменяете эту настройку в своем файле Project → Build Settings → filter on "Other" → Скрытые локальные переменные → изменить на "Нет"... или визуально:

Снимок экрана настроек Xcode Build, показывающий скрытые локальные переменные, установленные в