有条件地分配NSArray而不会从静态分析器中获得错误?

时间:2013-11-22 11:33:59

标签: ios iphone objective-c clang-static-analyzer

以下代码

 NSArray *colors = [[NSArray alloc]init];
if ([CONDITION]) {
    colors = @[
               [UIColor colorWithRed:240/255.f green:159/255.f blue:254/255.f alpha:1],
               [UIColor colorWithRed:255/255.f green:137/255.f blue:167/255.f alpha:1],
               [UIColor colorWithRed:126/255.f green:242/255.f blue:195/255.f alpha:1],
               [UIColor colorWithRed:119/255.f green:152/255.f blue:255/255.f alpha:1],
               [UIColor colorWithRed:240/255.f green:159/255.f blue:254/255.f alpha:1],
               ];
} else {
    colors = @[
               [UIColor colorWithRed:240/255.f green:159/255.f blue:254/255.f alpha:1],
               [UIColor colorWithRed:255/255.f green:137/255.f blue:167/255.f alpha:1],
               [UIColor colorWithRed:126/255.f green:242/255.f blue:195/255.f alpha:1],
               [UIColor colorWithRed:119/255.f green:152/255.f blue:255/255.f alpha:1],
               ];
}

这段代码执行得很完美但是在内存分析期间,我在静态分析器中遇到错误“Dead Store”“在初始化过程中存储到'colors'的值永远不会被读取”,我不知道我怎么能执行这段代码

2 个答案:

答案 0 :(得分:5)

将第一行更改为

NSArray *colors;

声明变量就足够了。无需创建空数组并将变量设置为此未使用的实例。

在将变量设置为正确的数组(在条件中)之前,其值在ARC下为nil,在手动保留计数中未定义。这与您的情况无关,因为在分配之前永远不会读取该值。

编辑:从评论和其他答案来看,似乎人们仍然关注未使用数组的分配。当然它是多余的 - 但编译器警告是关于一个变量被分配然后在下一个赋值之前永远不会被读取的事实。如果您使用int类型的变量,警告将是相同的。

答案 1 :(得分:1)

正如其他人所提到的,您无需alloc / init声明变量的数组。

有几个原因:

最明显的是在行

NSArray *colors = [[NSArray alloc]init]

创建一个对象并将其分配给变量,只是在if - 语句的两个分支中的赋值之后立即覆盖它。

无论if语句的条件如何,您新创建的数组都将丢失。

实际上,它的使用寿命为(最多)几微秒,而不会用于任何有用的东西。这就是静态分析器试图告诉你什么时候“在初始化期间永远不会读取存储到'颜色'的值” - 读取变量的值是对它做任何有用的事情的第一步。所以如果你再也不读它,你也可以不分配它。

稍微更微妙的原因是普通NSArray是不可变的,并且在不可变集合类上调用alloc / init只会创建一个永远不会被任何东西填充的空集合有用。

在某些情况下,您确实需要一个空的,不可变的数组,但它们并不多,而且显然不是您的情况:在创建之后,您继续创建包含一些实际内容的数组并将它们分配给变量