2

Clang Static Analyzer(CSA)が次のメッセージを出力するのはなぜですか?

'self'に格納された値は囲み式で使用されますが、値が実際に'self'から読み取られることはありません。

次の方法の場合:

- (id)init
{
    return (self = [super initWithStyle:UITableViewStyleGrouped]);
}

コードは期待どおりに機能するので、技術的な観点からコードが正しくないのか、これはCSA内のバグなのか、それとも非常に明白なものが欠落しているだけなのか疑問に思います。

参考までに、このパターンを使用しているのは、このクラスのインスタンスを作成するクラスがテーブルスタイルを指定できるようにしたくないためです。

4

2 に答える 2

2

これを行うためのより「適切な」方法は次のとおりです。

- (id)init
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    return self;
}

そして、それは静的アナライザーを満たす必要があります

編集:

Clangがその行を好まない理由についての私の最善の推測:

を書き込む(self = [super initWithStyle:UITableViewStyleGrouped])と、init呼び出しの結果が一時変数に格納され、一時変数がにコピーされますself。その後、メソッドから実際に返されるのはその一時変数です。

これは完全に合法で正常な動作ですが(アプリを壊すことはありません)、静的アナライザーは(正しく)格納されている値selfが実際に読み取られることはないことを認識します。

説明のために、次のコード:

- (id)init
{
    id temp = [super initWithStyle:UITableViewStyleGrouped];
    self = temp;
    return temp;
}

同じ静的アナライザエラーをスローします。

于 2009-12-23T02:23:56.123 に答える
0

そのself =部分は不要だということです。「壊れているか危険」という意味では正しくありませんが、意味がありません。変数selfが使用されることはないため、変数に割り当てる意味はありません。簡単に問題なく書くことができますreturn [super initWithStyle:UITableViewStyleGrouped];

于 2009-12-23T03:13:10.870 に答える