У меня огромная проблема с объектом NSTimer.Я не могу объяснить это поведение, и я постараюсь объяснить как можно лучше.
У меня есть функция, которая называется placeAdvertise.В этой функции есть несколько операций со статическими методами, которые используют в качестве параметра один из моих объектов (другое представление):
if (self.adsController == nil) {
self.adsController = [[AdsController alloc] ...];
[self.view addSubView: self.adsController.view;
}
if (banner != nil) {
self.adsController.banner = banner;
[self.adsController updateBanner];
//If a previous timer is still working (because this method can be called multiple times) invalidate
if (self.adsTimer != nil)
[self.adsTimer invalidate];
[Advertisement operation1: self.adsController];
[Advertisement operation2: self.adsController];
self.adsTimer = [NSTimer scheduledTimerWithTimeInterval: 5 ...];
}
Последний таймер вызывает другую функцию, называемую quitAdvertise, но он никогда не вызывается (когданеудача производится).Кажется, что код работает нормально в нормальных условиях, контроллер рекламы работает правильно, баннер размещается, и таймер вызывает adsTimer, который закрывает баннер.
Проблема появляется, если всплывающее представление (возврат назад) итолкни еще раз.Как только представление загружено, я нажимаю кнопку, которая запускает код, размещенный ранее.Код выполняется хорошо, , но в «середине» выполнения , в [Объявление операции 1: self.adsController] появляется EXC_BAD_ACCESS:
[MyController AdvertisingController]: сообщение отправлено в освобожденный экземпляр 0x4e9b420
Это как в середине кода, мой объект освобождается .У меня нет никакого кода, который вызывает освобождение объекта, только dealloc, который не был вызван для этого экземпляра представления (был вызван для предыдущего представления, которое всплыло).
Как это может быть возможно?Есть ли способ отладить это в лучших условиях?
Я использовал NSZombieEnabled.
Спасибо!
*** Небольшая правка для комментариев ***
1) AdsController выделяется следующим образом:
self.adsController = [[AdsController alloc] initWithNibName:nil bundle:nil];
После в методе dealloc:
[self.adsController release];
[super dealloc];
2) Уважение к таймеру:
It is allocated with repeat NO. After in dealloc:
if (self.adsTimer != nil) [self.adsTimer invalidate];
Это правильно?