【问题标题】:Invalidating an NSTimer?使 NSTimer 无效?
【发布时间】:2010-08-17 03:07:36
【问题描述】:

如果我有一个在 viewdidload 中启动的 NSTimer,那么在离开该视图时将其无效的合适位置在哪里?是不是也要放出来?

【问题讨论】:

  • 谢谢,如果我使用了 checkeventsTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(checkEvents) userInfo:nil repeats:YES];这是否意味着我需要释放它或只是使其无效?

标签: iphone xcode sdk nstimer invalidation


【解决方案1】:

如果您使用 NSTimer scheduledTimerWithTimeInterval... 创建一个计时器,那么您不需要释放它,因为您不拥有它。

现在重要的是计时器类保留了目标,在大多数情况下我们使用 self 作为目标。如果计时器不是重复的,那么在计时器处理程序完成后,它会自动变为无效并释放目标。所以你无事可做。但是,如果您的计时器在离开视图时仍处于挂起状态(如果您在计时器被触发或计时器重复之前离开,则会发生这种情况),那么您需要使其无效。这个地方不能是 dealloc 方法。由于计时器本身保留了目标,因此直到计时器无效才会调用dealloc。

因此,当您知道不再需要此功能时,最好将其无效。这可能是移动到另一个视图的动作。假设用户点击一个按钮并在按钮处理程序中移动到其他视图。您可以在此按钮处理程序中无效。

【讨论】:

  • 总是需要使计时器无效。如果您设置(例如)一个 10 秒的计时器,则用户有足够的时间在计时器触发之前离开视图。否则,答案大多是准确的。
  • 这正是我所说的“如果你在计时器被触发之前离开就会发生这种情况”的意思。并且使已经无效的计时器无效不会导致任何问题。
  • 我不需要总是使计时器无效。这取决于情况。如果我确定用户在触发非重复计时器之前无事可做,为什么我需要使其无效。说我在定时器触发后启用用户交互。我还需要使其无效吗?我知道失效不会导致任何问题,但从技术上讲,我不需要使其失效。
  • 通过将我的计时器放入将应用程序移动到另一个视图的按钮处理程序中使我的计时器无效会导致 EXC BAD ACCESS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多