Делалк позвонил дважды и рухнул на [супер сделка] - PullRequest
0 голосов
/ 15 сентября 2011

---- вопрос решен мной, информация обновлена ​​в моем комментарии ----

У меня есть контроллер представления, который имеет периодический NSTimer. Я вызываю аннулирование таймера при удалении контроллера вида:

- (void)dealloc
{
    NSLog(@"dealloc called");
    if ([myTimer isValid]) {
        [myTimer invalidate];
    }
    [super dealloc];
} 

Я обнаружил непредвиденное поведение, которое [myTimer invalidate] немедленно вызывает callloc моего контроллера представления. Вот почему я поставил проверку isValid, чтобы избежать сбоев. Но [super dealloc] будет вызван дважды и завершит работу приложения.

Итак, у меня есть два вопроса:

  1. Как правильно отключить таймер?

  2. Почему недействительный метод таймера вызывает метод dealloc контроллера представления?

Спасибо

Leo

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Как описано в CocoaDev: NSTimer :

Вот несколько правил, которые могут помочь вам с NSTimer:

Таймер сохраняет цель иОбъекты userInfo.

При планировании цикл запуска автоматически удерживает таймер.

Если таймер не настроен на повторение, он автоматически аннулируется при срабатывании.

Таймер освобождается из цикла выполнения при вызове invalidate.

Таймер освобождает объекты target и userInfo при вызове invalidate.

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

1 голос
/ 15 сентября 2011

Звучит как-то странно. Есть ли другие объекты, удерживающие ссылку на ваш контроллер вида?

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

...