NSTimer引起的循环引用

NSTimer大多数情况下载viewWillDisappear或者viewDidDisappear中释放就可以。但是有的场景是跳转到下一级页面,还需要NSTimer在跑,这时候就不能在那两个方法里面stopTimer了。 dealloc这个方法根本就不会触发。 方法有很多,但是以下方法感觉最简单,改动小。 

新建一个类。HFTimerProxy

HFTimerProxy.h

@interface HFTimerProxy : NSProxy

@property(weak, nonatomic) id target;

@end

HFTimerProxy.m

#import "HFTimerProxy.h"

#import

@implementation HFTimerProxy

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {

    return [self.target methodSignatureForSelector:sel];

}

- (void)forwardInvocation:(NSInvocation*)invocation {

    [invocationinvokeWithTarget:self.target];

}

@end

在对应的VC页面添加属性

@property (strong, nonatomic) HFTimerProxy *timerProxy;

- (HFTimerProxy *)timerProxy {

    if(!_timerProxy) {

        _timerProxy= [HFTimerProxyalloc];

        _timerProxy.target = self;

    }

    return _timerProxy;

}

在创建Timer时,target使用self.timerProxy

/// 创建定时器

- (void)createTimer{

    [self stopTimer];

    //创建 1 秒回调一次定时器

    self.timer = [NSTimer timerWithTimeInterval:1 target:self.timerProxy selector:@selector(timerCallBack:) userInfo:nil repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

}

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

推荐阅读更多精彩内容