关于定时器NSTimer与控制器循环引用的问题

如果我们在viewController中使用这个方法创建定时器,self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timerACtion:) userInfo:nil repeats:YES]; 会引起循环引用,因为创建NSTimer的时候传的target是self,所以NSTimer持有viewController,而self.timer又是viewController的一个属性,所以造成相互持有,从而造成循环引用。这样当我们在-(void)dealloc中调用[self.timer invalidate]方法是无效的,因为viewController的引用计数不为0,所以程序根本就不会走-(void)dealloc方法,这样资源得不到释放,会造成内存泄漏。

解决办法有两个:分别是1.在适当的时候主动调用invalidate方法,2.将代码分离到多个类中。

1.清理NSTimer。我们可以在-(void)viewWillDisappear:(BOOL)animated中调用[self.timer invalidate]方法,或者在-(void)didMoveToParentViewController:(UIViewController*)parent方法中调用[self.timer invalidate],都能起到同样的效果。

2.重点说明第二个方法。

第二中方法的好处有两个:1.清理器有定义良好的指责者持有,2.需要时任务可以被多个持有者重复使用。总的来说就是代码复用率高。

使用计时器重构后的代码

YHTimerUpdateTask.m文件

关于定时器NSTimer与控制器循环引用的问题_第1张图片

调用方法: self.updateTask = [[YHTimerUpdateTask alloc] initWithTimeInterval:2.0 target:self selector:@selector(updaeUsingFeed:)];

在dealloc方法中调用[self.updateTask shutDown]方法,YHTimerUpdateTask内部会销毁计时器。从而保证所拥有的对象被销毁,解除循环引用的问题。

你可能感兴趣的:(关于定时器NSTimer与控制器循环引用的问题)