NSTimer火灾问题(不是常见的无效问题)

时间:2011-05-03 09:32:46

标签: iphone nstimer

我的代码如下:

- ( void ) restart {
    [ self pause ];
    //init something here...
    [ self proceed ];
}

- ( void ) pause {
    if ( [ _timer isValid ] ) {
        [ _timer invalidate ];
        _timer = nil;
    }
}

- ( void ) proceed {
    _timer = [ NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector ( fireHandler ) userInfo: nil repeats: YES ];
}

大多数情况下它工作正常,但我发现在某些情况下,在我调用方法“重启”多次之后,有时候,fireHandler在一个timeInterval中被调用了多次(或者timeInterval变成了更短,无论如何,它突然跑得更快。)

现在我将发送者添加到fireHandler,并使用NSLog检查内存地址,我发现如下:

< _ NSCFTimer:0x4e610a0> < _NSCFTimer:0x4e610a0> < _ NSCFTimer:0x4e610a0> < _NSCFTimer:0x4e610a0> < _ NSCFTimer:0x4e610a0> < _NSCFTimer:0x4e610a0>

并重复......这意味着它始终是相同的计时器。 但有时当我再次调用“重启”时,它表示

< _ NSCFTimer:0x4e3d740> < _NSCFTimer:0x4e610a0> < _ NSCFTimer:0x4e3d740> < _NSCFTimer:0x4e610a0> < _ NSCFTimer:0x4e3d740> < _NSCFTimer:0x4e610a0> ...重复

这意味着有两个计时器,似乎第一个没有失效并按时释放。它与第二个同时运行,几秒钟之后,第二个被删除后,即使第一个仍然活着!

一段时间后会再次出现。这种情况并不常见,没有规则,它发生在整个时间的30%左右。我对此一无所知....请问,至少有人能给我一些想法来解决确切的问题。

1 个答案:

答案 0 :(得分:1)

[NSTimer scheduledTimerWithTimeInterval]每次调用时都会创建并安排一个新的计时器。因此,当您多次调用proceed时,系统每次都会创建并启动一个新的计时器,覆盖您的_timer引用并创建泄漏。

我不能说你为什么要描述这种行为,但偶然多次调用proceed可能是原因。考虑重写它,然后看看是否有帮助:

- (void)proceed 
{
    [_timer invalidate];
    _timer = [NSTimer schedule...];
}