NSTimer禁用UIView中的dealloc

ssj*_*ssj 9 objective-c nstimer uiview invalidation dealloc

@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
Run Code Online (Sandbox Code Playgroud)

释放someview不会调用dealloc并且计时器继续运行.

如果我注释掉"timer = [NSTimer schedule ...."部分,将调用dealloc.这意味着我的代码的所有其他部分都正常工作,而计时器是罪魁祸首.runTimer方法是空的,这意味着它只是与我混淆的计时器.

jfe*_*man 22

我认为在UIView中使用NSTimer的最佳解决方案是覆盖removeFromSuperview方法;

- (void)removeFromSuperview
{
    [timer invalidate];
    timer = nil;

    [super removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)

这里唯一要记住的是你需要确保timer不是一个nil对象,因为removeFromSuperview也可以从其他UIView的超级dealloc方法中自动调用.你可以用条件包裹来检查.


Mar*_*ell 14

NSTimer保留了目标.因此,在取消分配视图之前,必须使计时器无效.