美文网首页
性能优化之NSTimer

性能优化之NSTimer

作者: 涛昇依旧 | 来源:发表于2018-02-01 11:37 被阅读132次

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.开启定时器的时候直接调用这个类方法,就不会造成循环引用.看图

.h声明的方法 .m实现的逻辑

我们在调用定时器时,可以直接这样执行

直接这样调用就不会造成循环引用了

PS:刚刚发现iOS 10官方已经提供了api,好尴尬

官方自带的

因为这个方法是官方在iOS 10才引进的,iOS10以下的,无法调用,这是一个小问题,相比之下,我的还是蛮不错的,嘿嘿,自捧一波

相关文章

网友评论

      本文标题:性能优化之NSTimer

      本文链接:https://www.haomeiwen.com/subject/gvvsqxtx.html