我总是有一个类,只要对象处于活动状态,就需要设置一个计时器.通常是UIView,它做一些动画.
现在的问题是:如果我强烈引用NSTimer我创建并使-dealloc中的计时器失效并释放计时器,则永远不会使计时器失效或释放,因为从未调用-dealloc,因为运行循环保持对目标的强引用.那我该怎么办?如果我不能对计时器对象进行强烈的引用,这也是不好的,因为我可能需要一个引用才能阻止它.对物体的弱反射并不好,因为也许我会在它消失时访问它.所以最好保留我想要保留的东西.
你们是怎么解决这个问题的?superview必须创建计时器吗?那个更好吗?或者我应该真的只是做一个弱的参考,并记住运行循环对我的计时器有一个强大的参考,只要它没有失效?
将计时器目标的生命周期视为在屏幕上,而不是在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 进行调用.
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |