回应对此问题的评论: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];
}
}
答案 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中获取选择器。