【问题标题】:Why does Xcode 4 mark variables as unused even if they are?为什么 Xcode 4 将变量标记为未使用,即使它们是未使用的?
【发布时间】:2011-08-10 11:19:50
【问题描述】:

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

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

【问题讨论】:

  • "在初始化期间存储到 'levelScoreTimer' 的值永远不会被读取"。该消息正在告诉您究竟出了什么问题。

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


【解决方案1】:

修改代码

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];

【讨论】:

  • 是的,你是对的。我不需要这个计时器的变量,因为当我将其方法指定为选择器时,计时器作为参数传递,并且我使用该参数从内部停止它。谢谢。
【解决方案2】:

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

__unused NSTimer *timer = …;

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

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

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

【讨论】:

    【解决方案3】:

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

    根据我的经验,编译器比我们更了解这些事情。它不会像我们人类经常做的那样错过或忘记分配、保留或释放。

    【讨论】:

      【解决方案4】:

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

      [levelScoreTimer invalidate];
      levelScoreTimer = nil;
      

      引用自: How do I use NSTimer?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        相关资源
        最近更新 更多