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

hzx*_*zxu 0 objective-c nstimer nsrunloop ios

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

- (void)dealloc
{
    [_timer invalidate];
    [_timer release];
    [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

我在这个帖子中读到:

invalidate方法调用也会释放

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

谢谢!

rob*_*off 10

发送releaseNSTimer不会使它失效.

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

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

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

所以你应该invalidate用你的dealloc方法发送你的计时器,除非你确定它已经失效了.

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

  • "invalidate"是否释放计时器是无关紧要的.这是一个私人实施细节.*如果您拥有对它的引用,您*需要释放它*.阅读*[Cocoa Core Competencies:Memory management](http://developer.apple.com/library/ios/#DOCUMENTATION/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html)*. (2认同)