美文网首页工作生活
NSTimer的使用 避免循环引用 兼容iOS8系统

NSTimer的使用 避免循环引用 兼容iOS8系统

作者: 维若 | 来源:发表于2019-07-04 14:15 被阅读0次

    其实我知道大家不想看废话,但是我还是想写,最近哀家的内人要学习,哀家也开始写日志了,还写得贼拉拉仔细。
    工作需要,写个计时器,然后怎么写忘了,网上搜了一下,出来了一大片避免循环引用,大部分都说要写个类,然后self 弱引用这个类变量,要知道,楼主撸代码撸了有7个年头了,一句代码都不想多写,能拖控件就拖控件,我把我的方法贴出来,如果有问题,请大家不吝赐教。

    1.创建 strong修饰timer变量,如果创建weak,可能会被立即销毁。

    @property (strong, nonatomic)NSTimer *carouselTimer;
    

    2.实现它的get方法,避免重复创建。

    -(NSTimer *)carouselTimer
    {
        if (!_carouselTimer) {
            _carouselTimer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(autoDisplayCarousel) userInfo:nil repeats:true];
        }
        return _carouselTimer;
    }
    
    

    3.当界面出现的时候把计时器添加到runloop中。

    -(void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        //在用户触发滚动行为时,计时器会停止计时
       if (self.carouselTimer) {
            [[NSRunLoop currentRunLoop]addTimer:_carouselTimer forMode:NSDefaultRunLoopMode];
        }
    }
    

    4.在界面即将消失的时候,销毁计时器。

    -(void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        if (_carouselTimer ) {
            [_carouselTimer invalidate];
        }
    }
    

    当有强指针指向变量A的时候, 变量A就不能释放。必须先释放指向变量A的对象。

    viewWillDisappear的时候,调用[timer invalidate],销毁计时器,timer = nil,去掉了timer对self的强引用。
    循环引用就是A强引用B,B又强引用A,相互都得不到释放
    划重点,只要有强引用指针指向变量,变量就得不到释放。必须先释放强引用指针对象。

    相关文章

      网友评论

        本文标题:NSTimer的使用 避免循环引用 兼容iOS8系统

        本文链接:https://www.haomeiwen.com/subject/vgnlhctx.html