为什么Xcode 4将变量标记为未使用,即使它们是?

时间:2011-08-10 11:19:51

标签: iphone objective-c xcode4 nstimer compiler-warnings

我正在实例化并调度一个计时器变量,但是Xcode编译器和分析器将我的var“levelScoreTimer”标记为“警告:未使用的变量'levelScoreTimer'和”死存储:在初始化期间存储到'levelScoreTimer'的值'从来没有读过“。我的声明出了什么问题?scheduledTimerWithTimeInterval方法实例化并将计时器放在主运行循环上。我也从内部选择器方法停止计时器,因此确定使用计时器作为对象。有时类似通过在第一行声明变量类型并在第二行进行赋值,我将行分为两行。但它不是定时器对象的解决方案。有什么建议吗?这是我的声明和分配:

NSTimer *levelScoreTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTotalScoreLabelFromTimeLeftLabel:) userInfo:nil repeats: YES];

4 个答案:

答案 0 :(得分:18)

更改代码
NSTimer *levelScoreTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTotalScoreLabelFromTimeLeftLabel:) userInfo:nil repeats: YES];

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateTotalScoreLabelFromTimeLeftLabel:) userInfo:nil repeats: YES];

答案 1 :(得分:2)

编译器应该是正确的,你确定你没有做错什么吗?发布更多代码。在每种情况下,您都可以将变量标记为未使用:

__unused NSTimer *timer = …;

我在断言中使用它,例如在生产代码中编译出来并导致警告:

__unused NSString *foo = …;
NSAssert(foo, @"Bar");
// foo no longer used

但在你的情况下,我几乎可以肯定编译器是对的。你说你“从选择器方法中停止时间”,你的意思是从计时器触发时调用的方法?你如何获得指向计时器的指针?因为你显然将它存储在那里不可用的局部变量中。

答案 2 :(得分:1)

您没有显示足够的剩余代码,以确定您是否真的 使用 存储在levelScoreTimer中的值。如果这是一个局部变量,如果您在使用上面指定的值之前为其指定了其他内容,请查看您的方法。

根据我的经验,编译器比我们更了解这些事情。它不会错过或忘记任务,保留或释放,就像我们人类倾向于做的那样。

答案 3 :(得分:0)

考虑在适当的地方这样做:

[levelScoreTimer invalidate];
levelScoreTimer = nil;

参考: How do I use NSTimer?