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

时间:2013-06-03 23:40:57

标签: ios multithreading memory memory-management nstimer

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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;
}