Как отключить предупреждение «локальное объявление 'foo' скрывает переменную экземпляра”? - PullRequest
13 голосов
/ 10 июня 2011

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

Ответы [ 5 ]

6 голосов
/ 08 августа 2012

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

6 голосов
/ 26 июня 2011

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

Для дальнейшего использования этот идентификатор предупреждения можно найти, перейдя в Log Navigator, щелкнув самую последнюю сборку, в которой появилось предупреждение, углубившись в журнал, чтобы найти точку, где отображается задача «compile».с восклицательным знаком и нажмите кнопку «подробнее», которая выглядит как серая выноска с 5 горизонтальными линиями.Вы увидите предупреждения / ошибки, перечисленные в деталях, и, если бы был идентификатор предупреждения, он появился бы в строке с подробным описанием предупреждения желтым цветом.По крайней мере, так мне сказал один из инженеров компиляторов в Apple.У меня еще не появилось предупреждение о том, что я действительно хочу отключить, чтобы в журнале отображался идентификатор.

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

5 голосов
/ 18 апреля 2012

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

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

3 голосов
/ 12 апреля 2013
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);

}

Удачи! :)

1 голос
/ 01 апреля 2017

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

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

Учитывая

typedef BOOL ( ^BoolBoolBlock ) ( BOOL );

И природа блоков Apple сделает любую переменную, объявленную в непосредственной внешней области для блока, глобальной для блока (псевдоглобальные).В результате в строке 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; блокируется тенью от BOOL theResult = false;, что на самом деленамеренно по двум причинам в этом случае:

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

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

Чтобы успокоить няню (избавьтесьпредупреждений или, возможно, ошибок, если у вас есть дисциплина, устанавливающая предупреждения как ошибки), вы просто вносите это изменение в свой файл проекта -> Настройки сборки -> фильтр «Прочие» -> Скрытые локальные переменные -> меняете на «Нет»... или визуально:

screen shot of Xcode Build Settings showing Hidden Local Variables set to

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...