0

この質問に対するコメントへの回答: Xcode 4 静的アナライザーの警告を抑制することは可能ですか? 、これは誤検知です(少なくとも私はそう信じています)。

以下のコードは、次のメッセージを表示します。

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

NSArray *actions = [button actionsForTarget:target forControlEvent:controlEvent];
if (actions)
{
    NSEnumerator *actionEnumerator = [actions objectEnumerator];
    NSString *action;
    while ((action = (NSString *)[actionEnumerator nextObject])) 
    {
        [button removeTarget:target action:@selector(action) forControlEvents:controlEvent];
    }
}
4

3 に答える 3

3

それは@selector(action)、「action」というセレクターへの参照だからです。つまり、 への引数@selectorは、変数ではなくリテラルとして解析されます。

action変数はセレクターの命名を参照しているため、おそらくNSString次のようになります。

[button removeTarget:target action:NSSelectorFromString(action) forControlEvents:controlEvent];

実際には、アクションを繰り返す必要さえありません。これを行うためのより良い方法は、次のワンライナーです。

[button removeTarget:target action:NULL forControlEvents:controlEvent];
于 2011-06-16T16:54:39.633 に答える
2

これは誤検知ではなく、本当の (あなたの) バグです。

@selector(action)という名前のメソッドを記述しactionます。変数に格納されている名前のメソッドを記述していませaction!

静的アナライザーはあなたを保存しました... ;-)

于 2011-06-16T16:59:21.053 に答える
1

静的アナライザーは正しいです。アクションを使用/読み取りません! @selector()は NSString を取らないので、アクションと呼ばれるメソッドのセレクターを常に返します。プラス:@selector()はコンパイル時の関数です。コンパイラはそれを静的な値に置き換えます。sizeof()データ構造のサイズとほとんど同じです。

NSSelectorFromString()NSString からセレクターを取得するために使用する必要があります。

于 2011-06-16T16:54:19.100 に答える