Я видел, что вы уже приняли ответ, но есть две вещи, которые я хотел исправить:
- не требуется для сохранения запланированного таймера, но это нене навреди (пока вы отпускаете его, когда он больше не нужен).«Проблемная» часть отношения таймер / цель состоит в том, что ...
- таймер сохраняет свою цель .И вы решили установить эту цель на
self
.
Это означает - сохранен или нет - таймер будет поддерживать ваш объект живым, пока он действителен.
Спомните, что давайте пересмотрим ваш код снизу вверх:
- (void)dealloc {
[timer_porthole invalidate]; // 1
[timer_porthole release];
timer_porthole = nil; // 2
[super dealloc];
}
1 не имеет смысла:
Если timer_porthole
все еще был действительным таймером (т.е. запланирован на этапе выполнения) он сохранит ваш объект, поэтому этот метод не будет вызван в первую очередь ...
2 здесь тоже нет смысла:
Это dealloc
!Когда [super dealloc]
вернется, память, занятая вашим экземпляром в куче, будет освобождена.Конечно, вы можете обнулить свою часть кучи до ее освобождения.Но зачем?
Тогда есть
-(void) kill_timers{
[timer_porthole invalidate];
timer_porthole=nil; // 3
}
3 с учетом вашего инициализатора (и, как уже отмечали другие), вы теряете свой таймер здесь;перед этой строкой должно быть [timer_porthole release]
.
PS:
Если вы все обдумаете, вы увидите, что сохранение таймера (хотя бы временно) создает сохранить цикл .В данном конкретном случае это не проблема, которая решается, как только таймер становится недействительным ...