如何以正确的方式创建计时器?

时间:2010-04-25 23:56:57

标签: iphone timer

我总是有一个类,只要对象处于活动状态,就需要设置一个计时器。通常是一个做一些动画的UIView。

现在出现问题:如果我强烈引用NSTimer,我在-dealloc中创建并失效并释放定时器,则永远不会使定时器失效或释放,因为从不调用-dealloc,因为运行循环保持对目标的强引用。那我该怎么办?如果我不能对计时器对象进行强烈的引用,这也是不好的,因为我可能需要一个引用才能阻止它。对物体的弱反射并不好,因为也许我会在它消失时访问它。因此,最好保留我想要保留的内容。

你们是怎么解决这个问题的? superview必须创建计时器吗?那个更好吗?或者我应该真的只是做一个弱的参考,并记住运行循环对我的计时器有一个强大的参考,只要它没有失效?

3 个答案:

答案 0 :(得分: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;
    }
  }
}

为了完整起见,您可以在dealloc中调用[self runMyTimer:NO]

答案 1 :(得分:4)

对于View Controllers中的计时器,我的做法是:

scheduledTimerWithTimeInterval in viewDidAppear:

然后

invalidate it in viewWillDisapper:

答案 2 :(得分:1)

对于视图,我将相关的计时器放入viewControllers。

对于其他可能会自行消失的事情,我会使用相同的策略。计时器进入一个控制器对象,它本身(弱)指向可能自行消失的对象。然后计时器刺激受控对象。

但是,通常情况下,我对某事物的强烈引用很好。只要它在它消失之前告诉我,我就可以省略我的参考 - [nil anyMessage]成功....