NSTimer循环引用

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

开发过程中肯定会用到计时器,一般都会选择NSTimer,由于timer会在其内部对target强引用,而self.timer也会对timer强引用,这样就会产生循环引用问题。


所以要解决循环引用就需要把这个循环断开

方法一:
在NSTimer结束使用的时候,自动结束对NSTimer的引用,如在viewWillDisappear内停止timer并置空

   [_timer invalidate];
        _timer = nil;

方法二:
添加一个中间变量变量target,打破self和timer的循环,让target和timer相互引用,在self dealloc内切断target和timer的循环引用

//添加中转对象
self.target =  [NSObject new];
//动态添加方法
class_addMethod([_target class], @selector(fire),class_getMethodImplementation([self class], @selector(fire)),"v@:");
_timer = [NSTimer timerWithTimeInterval:1 target:_target selector:@selector(fire) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

方法三:
添加代理进行消息转发,打破self和timer的循环,让target和timer相互引用,在self dealloc内切断target和timer的循环引用

  _proxy = [JayProxy alloc];
    _proxy.target = self;
    _timer = [NSTimer timerWithTimeInterval:1 target:_proxy selector:@selector(fire) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];

demo已上传git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值