Проблема пожара NSTimer (не распространенная проблема недействительности) - PullRequest
0 голосов
/ 03 мая 2011

мой код, как показано ниже:

- ( 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 для проверки адреса памяти.что-то как показано ниже:

<_ <em>NSCFTimer: 0x4e610a0> <</em> _NSCFTimer: 0x4e610a0> <_ <em>NSCFTimer: 0x4e610a0> <</em> _NSCFTimer: 0x4e610a2> N: 0x4e610a0> <</em> _NSCFTimer: 0x4e610a0>

и повторить ... Это означает, что это всегда один и тот же таймер.Но иногда, когда я снова вызываю «restart», это указывает

<_ <em>NSCFTimer: 0x4e3d740> <</em> _NSCFTimer: 0x4e610a0> <_ <em>NSCFTimer: 0x4e3d740> <</em> _NSCFTimer:0x4e610a0> <_ <em>NSCFTimer: 0x4e3d740> <</em> _NSCFTimer: 0x4e610a0> ... повторяется

Это означает, что есть два таймера. Похоже, что первый из них не был недействительным и был выпущен вовремя,Он работает со вторым одновременно, а спустя несколько секунд после удаления второго, даже если первый еще жив!

Через некоторое время он снова появится.Такая ситуация не очень часто, без правил, это происходит около 30% всего времени.Я не имею ни малейшего представления об этом .... Пожалуйста, если кто-нибудь может дать мне какую-то идею, по крайней мере, решить проблему.

1 Ответ

1 голос
/ 03 мая 2011

[NSTimer scheduledTimerWithTimeInterval] создает и планирует новый таймер каждый раз, когда вы вызываете его. Поэтому, когда вы вызываете proceed несколько раз, система каждый раз создает и запускает новый таймер, переопределяя вашу ссылку _timer и создавая утечки.

Я не могу сказать, почему вы описываете поведение, но случайный вызов proceed несколько раз может быть причиной. Попробуйте вместо этого переписать его и посмотрите, поможет ли это:

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