2013-06-03 36 views
2

在我的视图控制器的代码我有这样一行:我是否需要使计时器无效/释放?

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

7秒后打了个电话,做一些事情......(我不定时分配给一个变量或属性)

如果在7秒钟之前释放视图控制器会发生什么情况?

我是否必须在某个时间点释放和/或使计时器无效(即在dealloc中)?

回答

3

这种定时器只保留在运行循环中。既然你没有指向它的指针,你就不能invalidate它。它也将保留它的目标(self),所以self不可能在定时器启动之前释放。启动后,运行循环将释放它,因此它将释放,导致它释放self,并允许该对象释放(假设其上没有其他保留)。

在大多数情况下,我不建议scheduledTimerWithTimeInterval:…,因为它使得它不可能为您定时器invalidate。但是,如果这种行为正是你想要的,那么它将正常工作,没有额外的代码。

+0

需要明确的是:他*能*无效计时器,但前提是他得到的引用。可以调用'scheduledTimerWithTimeInterval'并忽略该方法返回的'NSTimer'对象。但OP也可以将返回的NSTimer分配给ivar。他只需要小心避免保留循环:视图控制器<->定时器。 –

+0

对不起,是的,@AaronGolden在这里是正确的。 –

3

您应该将计时器分配给一个变量,然后在您的视图控制器的viewWillDisappear(或viewDidDisappear也许)方法中,您可以明确地使计时器无效并将该变量重新分配给nil。由于您不希望此计时器重复,因此您可能还需要在doSomething方法末尾将计时器指定为零。

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

例如,你可能会做这样的事情:

_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; 
} 
相关问题