iOS开发-NSTimer探究

本文详细探讨了iOS开发中NSTimer的使用,包括如何创建和销毁NSTimer,以及如何处理由NSTimer引发的循环引用问题。通过实例分析,解释了为什么在特定情况下NSTimer会导致控制器无法释放,并提出了多种解决方案,如在适当时间启动和销毁NSTimer,使用iOS10后的block方法,以及引入中间类等。
摘要由CSDN通过智能技术生成

NSTimer 的使用

1、NSTimer 的创建

我们经常会使用下面四种常用的 NSTimer 的创建方法,都是类方法。

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

首先使用 Target-action 的方法创建 NSTimer:

 NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(log) userInfo:nil repeats:YES];

使用 timerWithTimeInterval 开头的类方法,单是这样创建是不够的,NSTimer 只有加到 RunLoop 中的某个 mode 下才能运行(RunLoop 的相关内容就不在这里展开了),所以我们还需要手动把 NSTimer 加到 RunLoop 中的 NSDefaultRunLoopMode 下:

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

使用 scheduledTimerWithTimeInterval 开头的类方法,则不需要手动把 NSTimer 加到 RunLoop 中,因为方法内默认将 NSTimer 添加到 RunLoop 中的 NSDefaultRunLoopMode 下。

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(log) userInfo:nil repeats:YES];

2、 NSTimer 的销毁

NSTimer的唯一销毁方法 invalidate,本质上是将 NSTimer 从 RunLoop 中移除,撤销 RunLoop 对 NSTimer 的强引用。

- (void)invalidate;

[timer invalidate];

 在对 NSTimer 使用 invalidate 方法之后,最好还将 NSTimer 置为 nil,这是一种良好的规范和习惯。

timer = nil;

NSTimer 其实还有一个 fire 方法:如果 NSTimer 不重复,则在触发后会自动失效。

- (void)fire;

 而 fire 方法并不会将 NSTimer 从 RunLoop 中移除,所以不管怎样最后一定是要调用 invalidate 方法的,这也是我们不怎么看见 fire 方法的原因。

注意,使用 NSTimer 一定要记得销毁。

NSTimer 的循环引用

1、首先我们创建一个 OneViewController,我们先看一下 OneViewController 什么时候销毁:

@implementation OneViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)dealloc {
    NSLog(@"dealloc OneViewController");
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"从OneViewController返回!");
    [self.navigationController popViewControllerAnimated:YES];
}

我们把OneViewController push出来,再pop出去,看一下结果:

2019-02-18 23:46:45.621 --------[11119:550693] 从OneViewController返回!
2019-02-18 23:46:46.128 --------[11119:550693] dealloc OneViewController

由此可知,OneViewController 一被 pop 出去立即就销毁了,所以 OneV

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值