2011-01-13 19 views
4

我想用新的TimeInterval重置两个NSTimers。 如果我知道他们在重置它们之前是否被释放,这将是没有问题的。EXC_BAD_ACCESS通过重置NSTimer

我不能这样工作:

[timer invalidate]; 

if(startTimers == YES) 
    timer = [NSTimer scheduledTimerWithTimerInterval:...] 

,因为我不知道我之前是无效的计时器无效。

如果我使释放的定时器无效(在失效时定时器被释放),我得到一个EXC_BAD_ACCESS。

回答

14

当您释放计时器时,还将其变量设置为零。如果timer为零,那么[timer invalidate]将默默无闻。

[timer invalidate]; 
timer = nil; 
+0

由于它工作正常,你救了我的一天:-) – mabstrei 2011-01-13 19:24:32

1

我已经使用Brian液和仍然得到EXC_BAD_ACCESS

对我来说,dispatch_after解决了这个问题:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void){ 
    if ([_timer isValid]) [_timer invalidate]; 
    _timer = nil; 
    [self timer]; 
}); 

但它看起来有点脏了,我知道...