iOS - NSTimer中target是self从而导致强引用的问题
当控制器ViewController跳转进入控制器OneViewController中的时候开启定时器,让定时器每隔一段时间打印一次,当OneViewController dismiss的时候,控制器并没有被销毁.然而定时器的timer invalidate 在dealloc中已经写了.
如果没有定时器,则OneViewController可以正常销毁
原因在于:控制器强引用定时器;定时器里面的target为self对控制器又造成强引用,互相强引用,造成循环引用,无法释放,dealloc无法执行
解决方法:我们可以去写一个NSTimer的分类,在我们封装的类的方法中,我们将开启定时器的方法 [NSTimer scheduledTimerWithTimeInterval:interval target:timer selector:@selector(test:) userInfo:userInfo repeats:repeats];中的target换掉,换成本类的对象,timer.开启定时器的时候直接调用这个类方法,就不会造成循环引用.看图
我们在调用定时器时,可以直接这样执行
PS:刚刚发现iOS 10官方已经提供了api,好尴尬
因为这个方法是官方在iOS 10才引进的,iOS10以下的,无法调用,这是一个小问题,相比之下,我的还是蛮不错的,嘿嘿,自捧一波