Я понимаю, что предупреждает. Это точно, как работают правила определения области действия. Я ценю, что некоторым людям нужна няня. Я не. Как отключить это предупреждение?
Как отключить локальную декларацию "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" → Скрытые локальные переменные → изменить на "Нет"... или визуально: