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”的选择器的引用。换句话说, to 的参数@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,因此它总是返回一个名为 action 的方法的选择器。加:@selector()是一个编译时函数,编译器会将其替换为静态值。sizeof()与数据结构的大小非常相似。

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

于 2011-06-16T16:54:19.100 回答