ложные срабатывания Xcode4 Analyzer - PullRequest
0 голосов
/ 16 июня 2011

В ответ на комментарий по этому вопросу: Возможно ли подавить предупреждения статического анализатора 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];
    }
}

Ответы [ 3 ]

3 голосов
/ 16 июня 2011

Это потому, что когда вы делаете @selector(action), это ссылка на селектор, называемый «действие».Другими словами, аргумент @selector анализируется как литерал, а не переменная.

Поскольку переменная action ссылается на NSString с именем селектора, вероятно, вам нужно:

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

На самом деле, вам даже не нужно перебирать действия.Лучший способ сделать это - это одна строка:

[button removeTarget:target action:NULL forControlEvents:controlEvent];
2 голосов
/ 16 июня 2011

Это не ложный положительный результат, это реальная ( ваша ) ошибка.

@selector(action) описывает метод с именем action. не описывает метод с именем, которое хранится в переменной action!

Статический анализатор только что сохранил ваш ...; -)

1 голос
/ 16 июня 2011

Статический анализатор прав, вы не используете / не читайте его!@selector() не принимает NSString, поэтому он всегда возвращает селектор для метода, называемого action.Плюс: @selector() - это функция времени компиляции, компилятор заменит ее статическим значением.Почти так же, как sizeof() с размером структур данных.

Вы должны использовать NSSelectorFromString(), чтобы получить селектор из строки NSString.

...