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