【问题标题】:Value stored to NSString during its initialization is never read在初始化期间存储到 NSString 的值永远不会被读取
【发布时间】:2014-10-29 15:35:14
【问题描述】:

在我的 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;
}

当我在上面运行机器人时,它给了我以下警告:

机器人问题:analyzerWarning。死店。 问题:在初始化期间存储到“sActivity”的值永远不会被读取。 文件:SAAnnouncementService.m。 集成编号:42。 说明:在初始化期间存储到“sActivity”的值永远不会被读取。

机器人问题:analyzerWarning。死店。 问题:在初始化期间存储到“sActivity2”的值永远不会被读取。 文件:SAAnnouncementService.m。 集成编号:42。 说明:在初始化期间存储到“sActivity2”的值永远不会被读取。

谁能告诉这里可能是什么问题?

非常感谢任何形式的帮助!

【问题讨论】:

标签: ios objective-c nsstring


【解决方案1】:

问题是你初始化了变量,然后直接启动了 if-else 块,没有使用,即读取初始值。

当执行到 if-else 块时,它肯定会被分配一个新值,不管它之前是什么值。

【讨论】:

  • 我收到了这个错误。阅读您的答案后考虑一下,并在初始化后立即使用 remove all objects 方法使用数组,然后再设置 if-else 块中的值。感谢您的帮助。
  • 虽然现在我更了解它,但我在 if-else 中设置了值,并且我在初始化期间设置的值从未使用过,所以如果我从那时起删除[[NSMutableDictionary alloc] init]没事
【解决方案2】:

使用以下行:

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

您正在为 sActivity 和 sActivity2 对象分配字符串值。

然后,在 if 或 else 语句中修改这两个值。

但是,正如静态分析器所提到的,这些对象的初始值(@"activity" 和@"another activity")在第二次赋值之前(在 if / else 语句中)从未被读取过。

为避免此警告,您可以将上面的两行替换为:

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

希望有所帮助;)

【讨论】:

    【解决方案3】:

    当您收到警告时,编译器会告诉您“您在此处执行的操作看起来很荒谬,而且很可能不是您想要的”。

    看看这两条语句:

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

    这项任务是否有任何目的?看起来不像。所以编译器认为“要么这家伙做了一个相当昂贵的调用,完全没有意义,要么他实际上打算使用 NSLocalizedString 的结果但将它存储在错误的位置。”

    由于编译器假定人们不会做无意义的事情,因此它假定您的代码中存在错误并告诉您。在这种情况下,审查您的代码的人会停下来询问您打算在那里做什么。

    【讨论】:

      【解决方案4】:

      在您的代码中,sActivity 将被设置为在 IF/ELSE 内步行或跑步,因此为 sActivity 这一行设置的值

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

      永远不会被阅读。它可能不会导致错误,但分析器会提醒您这个多余的初始化。试试NSString *sActivity=nil;,看看能不能拒绝警告。

      【讨论】:

        【解决方案5】:

        您没有在 if-else 块中使用 sActivity,您只是根据决策为其分配值,因此要么将其设为 nil 字符串,如

        sActivity = nil;

        或喜欢

        NSString *sActivity;

        删除警告。

        【讨论】:

          猜你喜欢
          • 2011-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-11
          • 1970-01-01
          • 2018-07-26
          • 2015-07-26
          • 2012-01-19
          相关资源
          最近更新 更多