NSTimer和target之间的关系解除

问题思考

NStimer最为iOS开发中最常见的定时器,使用简单方便,但是在处理NStimer和target相互引用的问题时,需要提高警惕。因为NSTimer持有target,NStimer被runloop持有,导致如果不手动关掉NStimer对象,就会导致NSTimer和target的泄漏,而且因为这种关系,导致target的dealloc方法是不会执行的,但是想要造一个合适的时机去执行NSTimer的失效,手动去处理就比较费劲,比如在ViewDidDisappear,你需要去判断当前页面是pop还是Push

解决思路

为了解决NStimer和Target之间的这种关系,我们需要让target可以执行其dealloc方法,然后我们在dealloc方法中执行[NStimer invalidate]

解决办法

  • 我们将持有NStimer的对象,不要作为target,target作为timer事件的执行者,我们可以随便找一个对象,甚至类对象去响应,然后持有NStimer的对象调用dealloc的时候,执行[NSTimer invalidate]
  • 但是这样定时器事件执行就不会再NSTimer的持有者对象里,这样不便我们进行业务逻辑处理,想要将NStimer的持有者响应方法也很容易,我们可以传入block或者delegate,在target执行定时器方法时,执行block或者让delegate去执行,相当于将定时器方法又向外转发一次

关系图展示

image.png