2013-09-11 3 views
5

добавить таймер, как этотNSTimer не останавливается Invalidate

tim=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeatTim) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:tim forMode:NSDefaultRunLoopMode]; 

тим это NSTimer свойство моего класса.

Тогда я остановить его на кнопку мыши, как

[[fbt tim] invalidate]; 
[fbt setTim:nil]; 

FBT он является экземпляром моего класса.

, если я называю только ТЕРЯЕТСЯ то он не останавливается, но если я установить его на ноль, то я получил EXC_BREAKPOINT

здесь код метода repeatTim в селекторе

AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; 
[appDelegate.wbv stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"intal()"]]; 

Я пытался позвонить INIT и Invalidate в

dispatch_async(dispatch_get_main_queue(), ^{}) 

также не останавливается таймер.

+1

Показать код недвижимости. Использование ARC? – Wain

+0

Нет, я не использую ARC. о собственности @property (неатомный, сохранить) MyClass * fbt; – Sergey92zp

+0

Свойство для 'tim' является интересным. Это «сохранить»? – Wain

ответ

4

Читайте документацию для NSTimer:

Есть три способа создания таймера:

  1. Используйте scheduledTimerWithTimeInterval: призывание: повторы: или scheduledTimerWithTimeInterval: цели: селектор: USERINFO: повторы: класса, чтобы создать таймер и запланировать его в текущем цикле выполнения в режиме по умолчанию.

  2. Использование таймераWithTimeInterval: invocation: repeat: или timerWithTimeInterval: target: selector: userInfo: repeat: метод класса для создания объекта таймера без планирования его в цикле запуска. (После его создания вы должны добавить таймер в цикл выполнения вручную, вызвав метод addTimer: forMode: соответствующего объекта NSRunLoop.)

  3. Выделить таймер и инициализировать его с помощью initWithFireDate: interval: target: selector : userInfo: repeat: метод. (После его создания, вы должны добавить таймер в цикл выполнения вручную, вызвав ADDTimer: forMode:. Метод соответствующего объекта NSRunLoop)

Вы используете метод, который уже добавляет его MainLoop из 1. - вам нужно удалить эту строку или создать таймер с 2. подход и оставить ручное добавление.

Также помните, что вы должны отправить сообщение о недействительности из потока, на котором был установлен таймер. Если вы отправляете это сообщение из другого потока, источник входного сигнала, связанный с таймером, не может быть удален из цикла запуска, что может помешать правильному выводу потока.

+0

я удалил строку, и вызовите оба в dispatch_async (dispatch_get_main_queue(),^{}), но это дает мне EXC_BREAKPOINT on [fbt setTim: nil]; – Sergey92zp

+0

Что такое исключение? Неверный метод, называемый исключение nil - попробуйте отладить больше информации. Является ли «tim» свойство в вашем классе - вы его сохраняете или что-то в этом роде? Возможно, вставьте реализацию всего класса поэтому я могу помочь. –

+0

Это была моя ошибка, я проверил все остальные коды, и я обнаружил, что мой метод вызывается из цикла. – Sergey92zp

4

У вас работает более одного таймера. Попробуйте следующее:

-(void)startTimer{ 
    [self.myTimer invalidate]; // kill old timer 
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(doSomething) userInfo:nil repeats:YES]; 
} 

-(void)stopTimer{ 
    [self.myTimer invalidate]; 
    self.myTimer=nil; //set pointer to nil 
} 
Смежные вопросы