zoukankan      html  css  js  c++  java
  • 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掉,不管是调用系统方法还是自定义方法。

  • 相关阅读:
    NIO单一长连接——dubbo通信模型实现
    小谈网络游戏同步
    网络游戏同步问题综述
    TortoiseSVN客户端重新设置用户名和密码
    SVN服务器搭建和使用(三)
    SVN服务器搭建和使用(二)
    SVN服务器搭建和使用(一)
    Firefly 流程架构
    unity3d 手机震动
    Unity AssetBundle爬坑手记
  • 原文地址:https://www.cnblogs.com/yintingting/p/5402448.html
Copyright © 2011-2022 走看看