2010-04-25 59 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] in dealloc。

1

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

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

虽然我经常对某件事有强烈的参考。只要告诉我它消失之前,我可以空出我的参考 - [零anyMessage]成功....

4

对于视图控制器定时器,我的做法是:

scheduledTimerWithTimeInterval in viewDidAppear: 

然后

invalidate it in viewWillDisapper: