我的代码如下:
- ( 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%左右。我对此一无所知....请问,至少有人能给我一些想法来解决确切的问题。
答案 0 :(得分:1)
[NSTimer scheduledTimerWithTimeInterval]
每次调用时都会创建并安排一个新的计时器。因此,当您多次调用proceed
时,系统每次都会创建并启动一个新的计时器,覆盖您的_timer
引用并创建泄漏。
我不能说你为什么要描述这种行为,但偶然多次调用proceed
可能是原因。考虑重写它,然后看看是否有帮助:
- (void)proceed
{
[_timer invalidate];
_timer = [NSTimer schedule...];
}