性能优化之NSTimer

iOS - NSTimer中target是self从而导致强引用的问题

当控制器ViewController跳转进入控制器OneViewController中的时候开启定时器,让定时器每隔一段时间打印一次,当OneViewController dismiss的时候,控制器并没有被销毁.然而定时器的timer invalidate 在dealloc中已经写了.

如果没有定时器,则OneViewController可以正常销毁

原因在于:控制器强引用定时器;定时器里面的target为self对控制器又造成强引用,互相强引用,造成循环引用,无法释放,dealloc无法执行


性能优化之NSTimer_第1张图片
典型的循环引用

解决方法:我们可以去写一个NSTimer的分类,在我们封装的类的方法中,我们将开启定时器的方法 [NSTimer scheduledTimerWithTimeInterval:interval target:timer selector:@selector(test:) userInfo:userInfo repeats:repeats];中的target换掉,换成本类的对象,timer.开启定时器的时候直接调用这个类方法,就不会造成循环引用.看图


性能优化之NSTimer_第2张图片
.h声明的方法
性能优化之NSTimer_第3张图片
.m实现的逻辑

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


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

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


官方自带的

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

你可能感兴趣的:(性能优化之NSTimer)