我的代碼如下:的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已經一個一個時間間隔內調用一個以上的時間(或一個時間間隔是越來越短,無論如何,它的運行速度更快突然)。
現在我的發件人添加到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> ...重複
這意味着有兩個t imer,似乎第一個並沒有按時無效和釋放。它與第二個同時運行,幾秒鐘後,第二個被移除後,即使第一個仍然活着!
它將一段時間後再次出現。這種情況並不常見,如果沒有規則,就會發生在整個時間的大約30%。我對此沒有任何想法....如果有人能給我一些想法,至少得到確切的問題。
確保您每次都從同一個線程調用'restart'。 – 2011-05-03 12:01:05