Где аннулировать NSTimer ввиду жизненного цикла? - PullRequest
1 голос
/ 03 марта 2011

У меня странная проблема, делающая недействительным NSTimer.Пока пользователь находится на определенном экране, мне нужно постоянно его обновлять.Я использую NSTimer для этого.Я написал следующий фрагмент кода в методе viewDidLoad.

- (void)viewDidLoad {
self.pollServerForUpdates = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(fetchNewDataFromServer:)
userInfo:nil
repeats:YES];
}

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

-(void) viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:YES];
//NSLog(@"%d",[self.view retainCount]);
[self.pollServerForUpdates invalidate];
self.pollServerForUpdates = nil;
}

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

 *** -[CALayer retainCount]: message sent to deallocated instance 0x1c3be0

Если я удаляю аннулирование таймера, мое приложение работает нормально.Но я хочу остановить опрос (таймер), как только пользователь покинет экран.

Я полагаю, что это происходит, потому что таймер вызывается за доли секунды до того, как открывается представление, как мне избежать этого?Нужно ли менять свой дизайн?Любая помощь будет оценена.

ps: я не могу использовать push-уведомления на этом экране.

1 Ответ

1 голос
/ 03 марта 2011

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

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

...