我是否需要使计时器无效/释放?

问题描述 投票:2回答:2

在我的一个视图控制器代码中,我有这一行:

[NSTimer scheduledTimerWithTimeInterval:7.0 target:self selector:@selector(doSomethingOnce) userInfo:nil repeats:NO];

在7秒后调用并执行某些操作...(我不将计时器分配给变量或属性)

如果视图控制器在7秒结束之前被释放会发生什么?

我是否必须在某个时刻(即在dealloc中)释放和/或使Timer无效?

ios multithreading memory memory-management nstimer
2个回答
5
投票

这种计时器仅由运行循环保留。由于你没有指向它的指针,你不能invalidate它。它也将保留其目标(self),因此self不可能在定时器触发之前解除分配。在它触发后,运行循环将释放它,因此它将解除分配,导致它释放self,并允许该对象解除分配(假设其上没有其他保留)。

在大多数情况下,我不建议忽略scheduledTimerWithTimeInterval:…的返回值,因为它使你无法使用invalidate计时器。但是,如果这种行为正是您想要的(有时在AppDelegate中创建的全局计时器),那么它将正常工作而无需额外的代码。


3
投票

您应该将计时器分配给变量,然后在视图控制器的viewWillDisappear(或viewDidDisappear)方法中,您可以显式地使计时器无效并将变量重新分配给nil。由于您不希望此计时器重复,您可能还希望在doSomething方法结束时将计时器分配为nil。

计时器保留其目标的事实将阻止您的视图控制器在七秒钟之前被释放,但不会阻止视图控制器获取通常的外观相关消息。

例如,您可能会执行以下操作:

_doSomethingTimer = [NSTimer scheduledTimerWithTimeInterval:7.0 target:self selector:@selector(doSomethingOnce) userInfo:nil repeats:NO];
// The rest of whatever method this is in.
…

- (void)viewWillDisappear:(BOOL)animated {
    [_doSomethingTimer invalidate];
    _doSomethingTimer = nil;
}
© www.soinside.com 2019 - 2024. All rights reserved.