2010-04-25 4 views
0

У меня всегда есть класс, которому нужно настроить таймер до тех пор, пока объект жив. Обычно UIView, который выполняет некоторую анимацию.Как правильно создать таймер?

Теперь проблема: если я настоятельно ссылаюсь на NSTimer, я создаю и отменю и деблокирую таймер в -dealloc, таймер никогда не отменяется или не отменяется, поскольку -dealloc никогда не вызывается, поскольку цикл цикла поддерживает сильную ссылку на цель. Так что я могу сделать? Если я не могу удержать сильный рефлекс для объекта таймера, это также плохо, потому что, возможно, мне нужно дать ссылку на него, чтобы остановить его. И слабый рефлекс на объекте не очень хорош, потому что, возможно, я получу доступ к нему, когда он исчезнет. Поэтому лучше сохранить то, что я хочу сохранить.

Как вы, ребята, решаете это? должен ли супервизор создать таймер? это лучше? или я должен просто сделать слабый рефлекс на нем и помнить, что цикл выполнения содержит сильную ссылку на мой таймер для меня, если он не является недействительным?

ответ

5

Относитесь к времени жизни цели таймера как находящемуся на экране, а не между init и dealloc.

Для UIView сделать что-то вроде этого:

-(void) willMoveToSuperview:(UIView *)newSuperview { [self runMyTimer:newSuperview != nil]; } 

Для UIViewController сделать что-то вроде этого:

-(void) viewWillAppear:(BOOL)inAnimated { [self runMyTimer:YES]; } 
-(void) viewDidDisppear:(BOOL)inAnimated { [self runMyTimer:NO]; } 

Используя что-то вроде этого:

-(void) runMyTimer:(BOOL)inRun { 
    if (inRun) { 
    if (!myTimer) myTimer = [[NSTimer scheduled...] retain]; 
    } else { 
    if (myTimer) { 
     [myTimer invalidate]; 
     [myTimer release]; 
     myTimer = nil; 
    } 
    } 
} 

И для полноты картины можно назвать [self runMyTimer:NO] в dealloc.

1

Для просмотра я помещаю соответствующие таймеры в режим просмотра.

Для других вещей, которые могут исчезнуть сами по себе, я бы использовал ту же стратегию. Таймер переходит в объект контроллера, который сам ссылается (слабо) на объект, который может уйти сам по себе. Затем таймер выдает контролируемый объект.

Часто, хотя, я в порядке, имея сильную ссылку на что-то. До тех пор, как он говорит мне, прежде чем она уходит, я могу обнулить мой ссылку - [ноль anyMessage] преуспевает ....

4

Для таймеров в Список контроллеров, моя практика:

scheduledTimerWithTimeInterval in viewDidAppear: 

затем

invalidate it in viewWillDisapper: 
Смежные вопросы