2

对于以下代码

 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],
               ];
}

这段代码完美执行,但在内存分析期间,我在静态分析器“死存储”中出现错误“在初始化期间存储到“颜色”的值永远不会被读取”,我不确定我还能如何执行这段代码。

4

2 回答 2

5

将第一行更改为

NSArray *colors;

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

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

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

于 2013-11-22T11:36:23.533 回答
1

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

有几个原因:

最明显的是在行

NSArray *colors = [[NSArray alloc]init]

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

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

实际上,它的寿命(最多)只有几微秒,而不会被用于任何有用的事情。这就是静态分析器在说“从不读取初始化期间存储到'颜色'的值”时试图告诉您的内容-读取变量的值是对其进行任何有用的第一步。所以如果你再也没有读过它,你还不如不分配它。

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

在某些情况下,您确实需要一个空的、不可变的数组,但它们并不多,而且显然不是您的情况:在创建后立即创建具有一些实际内容的数组并将它们分配给变量。

于 2013-11-22T11:53:04.940 回答