NSTimer disables dealloc in UIView

后端 未结 3 1991
日久生厌
日久生厌 2021-02-06 02:56
@interface someview:UIView{
  NSTimer* timer;
}
@end

@implementation someview

-(void)dealloc{
  NSLog(@\"dealloc someview\");
  [timer invalidate];
  timer = nil;
}
-(         


        
相关标签:
3条回答
  • 2021-02-06 03:00

    As mentioned above, Timers retain their targets. Until the timer is invalidated, there is a retain cycle between the timer and the view, so the view will not be deallocated.

    I would invalidate the timer when it's removed from the view hierarchy by subclassing didMoveToSuperview, this gets called by the system when there is a View-Related Change (e.g superview changes). The 'removeFromSuperview' is only called when removeFromSuperview is called on UIView

    - (void)didMoveToSuperview
    {
        [super didMoveToSuperview];
    
        if (!self.superview)
        {
            [timer invalidate];
            timer = nil;
        }
    }
    
    0 讨论(0)
  • 2021-02-06 03:09

    NSTimer retains the target. Therefore, the timer must be invalidated before your view is dealloc'd.

    0 讨论(0)
  • 2021-02-06 03:26

    I think the best solution when using an NSTimer inside of a UIView is to override the removeFromSuperview method;

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

    The only thing to keep in mind here is that you need to ensure that timer is not a nil object because removeFromSuperview can also get automatically called from other UIView's super dealloc methods. You could wrap in a conditional to check.

    0 讨论(0)
提交回复
热议问题