Dealloc两次打电话给[super dealloc]

时间:2011-09-15 10:43:23

标签: iphone objective-c cocoa-touch ipad nstimer

----问题由我自己解决,信息在我的评论中更新----

我有一个具有定期NSTimer的视图控制器。我调用计时器的无效当我删除视图控制器时:

- (void)dealloc
{
    NSLog(@"dealloc called");
    if ([myTimer isValid]) {
        [myTimer invalidate];
    }
    [super dealloc];
} 

我发现了一个意外的行为,[myTimer invalidate]将立即调用我的视图控制器的dealloc。这就是为什么我把isValid检查以避免崩溃。但是[super dealloc]将被调用两次并崩溃应用程序。

因此,我有两个问题:

  1. 使计时器无效的正确方法是什么?

  2. 为什么计时器的invalidate方法调用视图控制器的dealloc方法?

  3. 由于

    利奥

2 个答案:

答案 0 :(得分:3)

CocoaDev: NSTimer所述:

  

以下是一些可以帮助您使用NSTimer的规则:

     

计时器保留target和userInfo对象。

     

计划时,运行循环会自动保留计时器。

     

如果计时器没有设置为重复,它将在触发时自动使其自动失效。

     

调用invalidate时,计时器从运行循环中释放。

     

计时器在调用invalidate时释放目标和userInfo对象。

     

换句话说,如果释放重复计时器而不使其失效,它将继续重复,因为运行循环保留它。但是,如果您不想在应用程序退出之前停止计时器,或者计时器不重复,则可以在安排计时器后将其释放而不调用invalidate。

答案 1 :(得分:1)

这听起来像是一些奇怪的行为。是否还有其他对象持有对视图控制器的引用?

如果没有,有可能一旦取下定时器&从运行循环中释放出来的视图控制器不再引用它(因此被解除分配)。