NSTimer 循环引用问题解决

本文详细介绍了在iOS开发中实现定时器的多种方法,包括将target设置为非self、利用iOS10后引入的block实现,以及通过category扩展NSTimer类来简化定时任务的调用。每种方法都有其适用场景,帮助开发者灵活应对不同需求。
摘要由CSDN通过智能技术生成

1、改变target为非self

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self.viewModel selector:@selector(countdown:) userInfo:nil repeats:YES];

2、iOS10以后提供了block实现

__weak __typeof(self) weakSelf = self;
if (@available(iOS 10.0, *)) {
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
            [weakSelf countdown];
        }];
//或
    self.timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
            [weakSelf countdown];
        }];
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
} else {
    // Fallback on earlier versions
}

3、category

typedef void(^TimerBlock)(void);

@interface NSTimer (WSTimer)

+ (NSTimer *)xfTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(TimerBlock)block;

@end

@implementation NSTimer (WSTimer)

+ (NSTimer *)xfTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(TimerBlock)block{
    return [self timerWithTimeInterval:interval target:self selector:@selector(timerSelector:) userInfo:block repeats:repeats];
}

+ (void)timerSelector:(NSTimer *)timer{
    TimerBlock block =[timer userInfo];
    if (block) {
        block();
    }
}

@end

使用

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    __weak __typeof(self) weakSelf = self;
    self.timer = [NSTimer xfTimerWithTimeInterval:1 repeats:YES block:^{
        [weakSelf countdown];
    }];
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值