2010-09-20 85 views
2

我有一个类NSTimer *myTimer;变量。在某些时候,我做的:NSTimer不停止

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

进一步,我有一个方法:

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

现在,问题:

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

,我停止我的定时器类时通过释放当我释放课程时,定时器继续运行,并继续发射事件。难道我做错了什么?看起来dealloc方法从来没有被调用,否则myTimer将为零,即使选择器被触发,它也不会进入if(myTimer)

回答

7

这绝不会工作,因为定时器保留它们的目标,这意味着你的方法永远不会直到被调用后你已经invalidated该定时器。

欲了解更多信息,请参阅NSTimer文档和"Dangerous Cocoa Calls"

+2

所以你应该清理计时器,然后再期待物体消失。 – 2010-09-20 16:09:09

+0

@Joshua +1这就是我所说的......你必须使计时器无效以便让你的对象释放,这可能最终触发'dealloc'方法(只是没有太多的单词):) – 2010-09-20 16:11:59

0

您是否尝试过在您的处置方便的调试工具,这个博客帖子?如果你在dealloc方法中设置了一个断点,会发生什么?另外,您应该在创建过程中发布更多的上下文。是否有可能不止一次地创建定时器,从而替换原始的(但不是使其无效)并将它放在那里以随意触发?

+0

是的..没有达到dealloc – Daniel 2010-09-20 16:32:31

+0

我不是创建它多次。只在一个地方,只有一次。 – Daniel 2010-09-20 16:36:01