NSTimer内存方面的探究

今天研究一个框架,看到它对NSTimer的处理,感觉很有意思。于是自己在各种情况下都研究了一下,现总结如下。

我们用到NSTimer时,似乎习惯于会在dealloc方法中把它invalidate掉,但是发现这样写并没有作用,NSTimer所在的类并没有被释放掉,而是继续执行NSTimer的方法。

所以,最终的解决方法应是在要释放NStimer所在类之前,invalidate它。

1.在UIView中

 可以写在

- (void)willMoveToSuperview:(UIView *)newSuperview中,这个方法是把view添加到父控件或从父控件移除掉时会调用

例如:

- (void)willMoveToSuperview:(UIView *)newSuperview{
    
    
    if (!newSuperview) {//从父控件移除时
        [self.timer invalidate];
        self.timer = nil;
    }
    NSLog(@"willMoveToSuperview");
}

2.UIViewController中

 ---push

    

- (void)willMoveToParentViewController:(UIViewController *)parent{
    
    if (!parent) {
        [self.timer invalidate];
        self.timer = nil;
    }
  
}

--present

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{
    
    [self.timer invalidate];
    self.timer = nil;
    [super dismissViewControllerAnimated:flag completion:completion];
}

3.NSObject

  这个我没找到方法,就自己写一个比如dismissAll的方法,然后在释放此对象之前调用这个方法即可。

总之原理就是,不管怎样,只要需要释放有NSTimer的类,就在释放它之前把它invalidate掉,不管是调用系统方法还是自定义方法。

原文地址:https://www.cnblogs.com/yintingting/p/5402448.html