NSTimer:在发布时被调用无效?

时间:2012-08-07 06:48:53

标签: objective-c ios nstimer nsrunloop

我有一个有NSTimer的类,当我发布它时,也会失效吗?或者我可以在dealloc中执行它们:

- (void)dealloc
{
    [_timer invalidate];
    [_timer release];
    [super dealloc];
}

我在这个帖子中读到:

invalidate method call also does a release

选择的答案说无效方法也会释放,所以如果我使其失效,我不需要释放它吗?

谢谢!

1 个答案:

答案 0 :(得分:10)

release发送NSTimer不会使其失效。

如果在运行循环中调度NSTimer,则运行循环将保留计时器。因此,即使您释放(计划的)计时器,它仍然具有大于零的保留计数。此外,它将继续射击。如果计时器的目标已被解除分配,则应用程序可能会在计时器触发时崩溃。

当您将invalidate发送到计划的计时器时,运行循环会释放计时器。

如果未在运行循环中调度NSTimer,则无需使其失效。但是将invalidate发送到计时器是安全的,无论是计划的,未计划的还是已经无效的。

因此,您应该使用invalidate方法发送计时器dealloc,除非您确定它已经失效。

如果您使用[[NSTimer alloc] initWith...]创建了计时器,那么您也应该将其释放。但是如果您使用[NSTimer timerWith...][NSTimer scheduledTimerWith...]创建了计时器,那么您应该将其释放,因为您没有对它的引用。