永远不会读取在初始化期间存储到NSString的值

时间:2014-10-29 15:35:15

标签: ios objective-c 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;
}

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

  

Bot Issue:analyzerWarning。死店。   问题:存储到' sActivity'在初始化期间永远不会读取。   文件:SAAnnouncementService.m。   整合数:42。   说明:存储到' sActivity'在初始化期间永远不会读。

     

Bot Issue:analyzerWarning。死店。   问题:存储在' sActivity2'在初始化期间永远不会读取。   文件:SAAnnouncementService.m。   整合数:42。   说明:存储到' sActivity2'在初始化期间永远不会读。

有人能说出这里可能出现的问题吗?

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

5 个答案:

答案 0 :(得分:7)

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

当执行到if-else块时,无论它以前是什么值,都肯定会为它分配一个新值。

答案 1 :(得分:2)

使用以下行:

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

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

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

但是,正如静态分析器所提到的那样,这些对象的初始值(@"活动"和@"另一个活动")在第二次分配之前从未被读过(如果/其他声明)。

要避免此警告,您可以通过以下方式替换上面的两行:

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

希望有所帮助;)

答案 2 :(得分:1)

当你收到警告时,编译器告诉你“你在这里做什么看起来像废话,很可能不是你想要的”。

看看这两个陈述:

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

作业是否有用?看起来不像。所以编译器认为“要么这个人做了一个相当昂贵的调用,这完全没有意义,要么他实际上打算使用NSLocalizedString的结果,但是把它存放在错误的地方。”

由于编译器假定人们不做无意义的事情,因此它假定代码中存在错误并告诉您相关信息。这是人类审查你的代码会停止并询问你打算在那里做什么的事情。

答案 3 :(得分:0)

在您的代码中,sActivity将设置为在IF / ELSE中步行或运行,以便为sActivity此行设置的值

 NSString *sActivity = NSLocalizedString(@"activity", @"activity");
永远不会读到

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

答案 4 :(得分:0)

你没有在if-else块中使用sActivity,你只是根据决定给它赋值,所以要么把它取为nil string

  

sActivity = nil;

或喜欢

  

NSString * sActivity;

删除waring。