我总是有一个类,只要对象处于活动状态,就需要设置一个计时器。通常是一个做一些动画的UIView。
现在出现问题:如果我强烈引用NSTimer,我在-dealloc中创建并失效并释放定时器,则永远不会使定时器失效或释放,因为从不调用-dealloc,因为运行循环保持对目标的强引用。那我该怎么办?如果我不能对计时器对象进行强烈的引用,这也是不好的,因为我可能需要一个引用才能阻止它。对物体的弱反射并不好,因为也许我会在它消失时访问它。因此,最好保留我想要保留的内容。
你们是怎么解决这个问题的? superview必须创建计时器吗?那个更好吗?或者我应该真的只是做一个弱的参考,并记住运行循环对我的计时器有一个强大的参考,只要它没有失效?
答案 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]成功....