Значение, сохраненное в NSString во время его инициализации, никогда не читается

В моем приложении iOS у меня есть следующий код:

case SASpeechSubCase03:
{
     SAActivity currentActivity = self.mediator.selectedActivity;

     NSString *sActivity = NSLocalizedString(@"activity", @"activity");
     NSString *sActivity2 = NSLocalizedString(@"another activity", @"another activity");
     if(currentActivity == SAActivityWalk)
     {
        sActivity = NSLocalizedString(@"walk", @"walk");
        sActivity2 = NSLocalizedString(@"walking", @"walking");
     }
     else
     {
        sActivity = NSLocalizedString(@"run", @"run");
        sActivity2 = NSLocalizedString(@"jogging", @"jogging");
     }

     return [NSString stringWithFormat:speech.text, sActivity, sActivity2];

     break;
}

Когда я запускаю на нем ботов, это выдает мне следующее предупреждение:

Проблема с ботом: анализатор, предупреждение. Мертвый магазин. Проблема: значение, сохраненное в 'sActivity' во время его инициализации, никогда не читается. Файл: SAAnnouncementService.m. Интеграционный номер: 42. Описание: значение, сохраненное в 'sActivity' во время его инициализации, никогда не читается.

Проблема с ботом: анализатор, предупреждение. Мертвый магазин. Проблема: значение, сохраненное в 'sActivity2' во время его инициализации, никогда не читается. Файл: SAAnnouncementService.m. Интеграционный номер: 42. Описание: значение, сохраненное в 'sActivity2' во время его инициализации, никогда не читается.

Может кто-нибудь сказать, в чем проблема может быть здесь?

Любая помощь высоко ценится!

5 ответов

Решение

Проблема в том, что вы инициализировали переменные, а затем непосредственно запустили блоки if-else, не используя, т.е. считывая, начальные значения.

Когда выполнение попадет в блоки if-else, ему определенно будет присвоено новое значение, независимо от того, какое значение оно было раньше.

Со следующей строкой:

 NSString *sActivity = NSLocalizedString(@"activity", @"activity");
 NSString *sActivity2 = NSLocalizedString(@"another activity", @"another activity");

Вы присваиваете строковые значения объектам sActivity и sActivity2.

Затем эти два значения изменяются в операторе if или else.

Но, как упоминает статический анализатор, начальные значения этих объектов (@"активность" и @ "другое действие") никогда не читались перед вторым присваиванием (в операторе if / else).

Чтобы избежать этого предупреждения, вы можете заменить две строки выше:

 NSString *sActivity = nil;
 NSString *sActivity2 = nil;

Надеюсь, это поможет;)

Когда вы получаете предупреждение, компилятор говорит вам: "то, что вы здесь делаете, выглядит глупостью и, скорее всего, не тем, что вы хотите".

Посмотрите на эти два утверждения:

 NSString *sActivity = NSLocalizedString(@"activity", @"activity");
 NSString *sActivity2 = NSLocalizedString(@"another activity", @"another activity");

Назначение служит какой-либо цели? Это не похоже на это. Таким образом, компилятор считает, что "либо парень сделал довольно дорогой вызов, который совершенно бессмыслен, либо он действительно намеревался использовать результат NSLocalizedString, но сохранил его в неправильном месте".

Поскольку компилятор предполагает, что люди не делают бессмысленных вещей, он предполагает, что в вашем коде есть ошибка, и сообщает вам об этом. Это тот случай, когда человек, проверяющий ваш код, останавливается и спрашивает вас, что вы намерены делать там.

Вы не используете sActivity в блоках if-else, вы просто присваиваете ему значения на основе решения, поэтому либо принимайте ноль строк, например

sActivity = ноль;

или как

NSString *sActivity;

убрать пари

В ваших кодах sActivity будет установлен или ходить или бегать в IF/ELSE, так что значение для sActivity эта линия

 NSString *sActivity = NSLocalizedString(@"activity", @"activity");

никогда не будет прочитан. Это может не вызвать ошибку, но анализатор напомнил вам об этой избыточной инициализации. Пытаться NSString *sActivity=nil;Посмотрите, можно ли отключить предупреждение.

Другие вопросы по тегам