误报Xcode4 Analyzer

时间:2011-06-16 16:42:38

标签: objective-c xcode4 clang clang-static-analyzer

回应对此问题的评论:Is it possible to suppress Xcode 4 static analyzer warnings?,这是误报(或者至少我相信)。

以下代码提供以下信息:

虽然存储在'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 个答案:

答案 0 :(得分:3)

那是因为当你执行@selector(action)时,它是对名为“action”的选择器的引用。换句话说,@selector的参数被解析为文字,而不是变量。

由于action变量指的是命名选择器的NSString,所以你想要的可能是:

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

实际上,您甚至不需要遍历这些操作。更好的方法是这样做:

[button removeTarget:target action:NULL forControlEvents:controlEvent];

答案 1 :(得分:2)

这不是误报,它是一个真实的(你的)错误。

@selector(action)描述了名为action的方法。它描述一个名称存储在变量action中的方法!

静态分析仪刚刚保存了你的......; - )

答案 2 :(得分:1)

静态分析仪是对的,你不用/读动作吧! @selector()不接受NSString,因此它总是返回一个名为action的方法的选择器。另外:@selector()是一个编译时函数,编译器将用静态值替换它。与sizeof()非常相似,数据结构的大小。

您应该使用NSSelectorFromString()从NSString中获取选择器。