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

don*_*ile 0 iphone timer

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

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

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

dra*_*ard 5

将计时器目标的生命周期视为在屏幕上,而不是在init和dealloc之间.

对于UIView做这样的事情:

-(void) willMoveToSuperview:(UIView *)newSuperview { [self runMyTimer:newSuperview != nil]; }
Run Code Online (Sandbox Code Playgroud)

对于UIViewController,执行以下操作:

-(void) viewWillAppear:(BOOL)inAnimated { [self runMyTimer:YES]; }
-(void) viewDidDisppear:(BOOL)inAnimated { [self runMyTimer:NO]; }
Run Code Online (Sandbox Code Playgroud)

使用这样的东西:

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

为了完整[self runMyTimer:NO]起见,您可以使用dealloc 进行调用.