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];

}

你可能感兴趣的:(NSTimer引起的循环引用)