@interface someview:UIView{
NSTimer* timer;
}
@end
@implementation someview
-(void)dealloc{
NSLog(@"dealloc someview");
[timer invalidate];
timer = nil;
}
-(void)runTimer{
//
}
-(void)someMethod{
timer = [NSTimer timerWithTimeInterval:2.0f target:self selector:@selector(runTimer) userInfo:nil repeats:YES];
}
@end
释放某个视图不会调用dealloc,并且计时器会继续运行。
如果我注释掉"timer = [NSTimer schedule...“part,将调用dealloc。这意味着我的代码的所有其他部分都工作正常,而定时器是罪魁祸首。runTimer方法是空的,这意味着它只是定时器在干扰我。
发布于 2011-04-15 06:30:53
NSTimer保留目标。因此,在取消分配视图之前,必须使计时器无效。
发布于 2011-05-20 02:54:24
我认为在UIView中使用NSTimer时最好的解决方案是覆盖removeFromSuperview方法;
- (void)removeFromSuperview
{
[timer invalidate];
timer = nil;
[super removeFromSuperview];
}
这里唯一要记住的是,您需要确保timer不是一个空对象,因为removeFromSuperview也可以从其他UIView的超级dealloc方法中自动调用。你可以用一个条件来检查。
发布于 2013-12-18 23:28:45
如上所述,计时器保留其目标。在计时器失效之前,在计时器和视图之间有一个保留周期,因此视图不会被释放。
当计时器从视图层次结构中移除时,我会通过对didMoveToSuperview
进行子类化来使其无效,当存在与视图相关的更改(例如,superview更改)时,系统会调用这个子类化。仅当对UIView调用removeFromSuperview
时才调用“removeFromSuperview”
- (void)didMoveToSuperview
{
[super didMoveToSuperview];
if (!self.superview)
{
[timer invalidate];
timer = nil;
}
}
https://stackoverflow.com/questions/5670431
复制相似问题