Почему Xcode 4 помечает переменные как неиспользуемые, даже если они есть? - PullRequest
5 голосов
/ 10 августа 2011

Я создаю экземпляр и планирую переменную таймера, но компилятор и анализатор XCode помечает мою переменную "levelScoreTimer" двумя предупреждениями, такими как "предупреждение: неиспользуемая переменная" levelScoreTimer "и" Мертвое хранилище: значение, сохраненное в 'levelScoreTimer "во время его инициализации никогда не читать ". Что не так с моим объявлением? Метод scheduleTimerWithTimeInterval создает экземпляр и помещает таймер в основной цикл выполнения. Я также останавливаю таймер из метода селектора внутри, поэтому таймер как объекты используется наверняка. Иногда в аналогичных В некоторых случаях я разбиваю строку на две строки, объявляя тип переменной в первой строке и назначая ее во второй строке. Но это не решение для объекта таймера. Любые предложения? Вот мое объявление и присвоение:

NSTimer *levelScoreTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTotalScoreLabelFromTimeLeftLabel:) userInfo:nil repeats: YES];

Ответы [ 4 ]

18 голосов
/ 10 августа 2011

Измените код с

NSTimer *levelScoreTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTotalScoreLabelFromTimeLeftLabel:) userInfo:nil repeats: YES];

до

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTotalScoreLabelFromTimeLeftLabel:) userInfo:nil repeats: YES];
2 голосов
/ 10 августа 2011

Компилятор должен быть верным, вы уверены, что не делаете что-то не так? Опубликуйте больше кода. В каждом случае вы можете пометить переменную как неиспользованную:

__unused NSTimer *timer = …;

Я использую это, например, в утверждениях, которые компилируются в производственном коде и приводят к предупреждениям:

__unused NSString *foo = …;
NSAssert(foo, @"Bar");
// foo no longer used

Но в вашем случае я почти уверен, что компилятор прав. Вы говорите, что «останавливаете время с помощью метода селектора», вы имеете в виду метод, который вызывается при срабатывании таймера? Как вы получаете указатель на таймер? Потому что вы, очевидно, храните его в локальной переменной, которая там не будет доступна.

1 голос
/ 10 августа 2011

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

По моему опыту, компилятор знает такие вещи лучше, чем мы,Он не пропускает и не забывает назначение, сохранение или освобождение, как мы, люди, склонны делать.

0 голосов
/ 10 августа 2011

Подумайте об этом в соответствующем месте:

[levelScoreTimer invalidate];
levelScoreTimer = nil;

Ссылаясь на: Как мне использовать NSTimer?

...