2

我有一个带NSTimer *myTimer;变量的类。在某些时候我会:

myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(doStuff) userInfo:nil repeats: YES]; 

此外,我有一个方法:

- (void)doStuff
{
  if(myTimer)
  {
    //do stuff
  }
}

当课程通过以下方式释放时,我会停止计时器:

- (void)dealloc
{ 
 if (myTimer) { //if myTimer==nil it already has been stopped in the same way
  [myTimer invalidate];
  myTimer = nil;
 }
}

现在,问题是当我释放课程时,计时器会不断地继续触发事件。难道我做错了什么?似乎从不调用 dealloc 方法,否则 myTimer 将为零,即使选择器被触发,它也不会进入if(myTimer)

4

2 回答 2

7

这永远不会起作用,因为计时器会保留它们的目标,这意味着在您拥有计时器之前,您的dealloc方法永远不会被调用。invalidated

有关更多信息,请参阅有关“危险可可呼叫”NSTimer的文档和此博客文章

于 2010-09-20T16:07:43.403 回答
0

您是否尝试过方便使用的调试器工具?如果在 dealloc 方法中设置断点会发生什么?此外,您应该围绕您的创作发布更多背景信息。您是否有可能不止一次地创建计时器,从而替换原始计时器(但不使其无效)并将其留在那里随意触发?

于 2010-09-20T16:08:11.060 回答