性能优化之NSTimer

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以下的,无法调用,这是一个小问题,相比之下,我的还是蛮不错的,嘿嘿,自捧一波

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容