工作生活

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

2019-07-04  本文已影响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,相互都得不到释放
划重点,只要有强引用指针指向变量,变量就得不到释放。必须先释放强引用指针对象。

上一篇下一篇

猜你喜欢

热点阅读