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;

変数を宣言するだけで十分です。空の配列を作成して、この未使用のインスタンスに変数を設定する必要はありません。

変数が (条件で) 適切な配列に設定されるまで、その値はnilARC 未満になり、手動保持カウントでは未定義になります。割り当ての前に値が読み取られることはないため、これはあなたのケースには関係ありません。

編集:コメントと他の回答から、人々はまだ未使用の配列の割り当てに集中しているようです。もちろん冗長ですが、コンパイラの警告は、変数が代入され、次の代入の前に読み取られないという事実に関するものです。タイプの変数を使用する場合int、警告は同じになります。

于 2013-11-22T11:36:23.533 に答える
1

他の人が述べたように、alloc/init変数を宣言する配列にする必要はありません。

いくつかの理由:

最も明白なのは、

NSArray *colors = [[NSArray alloc]init]

オブジェクトを作成して変数に割り当てますが、ステートメントの両方のブランチの割り当ての直後に上書きするだけifです。

ステートメントの条件がどうであれ、if新しく作成した配列は失われます。

実際には、何の役にも立たずに(せいぜい)数マイクロ秒しか寿命がありません。これは、静的アナライザーが「初期化中に 'colors' に保存された値は決して読み取られない」と言ったときに伝えようとしていることです。したがって、二度と読まない場合は、割り当てない方がよいでしょう。

もう少し微妙な理由は、プレーンは不変であり、不変のコレクション クラスで/NSArrayを呼び出すと、有用なもので満たすことのできない空のコレクションが作成されるだけだからです。allocinit

空の不変配列が必要な場合もありますが、それほど多くはなく、明らかにあなたの場合ではありません: 作成直後に、実際のコンテンツを含む配列を作成し、それらを変数に割り当てます。

于 2013-11-22T11:53:04.940 に答える