2011-09-15 38 views
0

----问题由自己解决,信息在我的评论更新----的dealloc在[超级的dealloc]

打了两次电话和崩溃我有具有周期性的NSTimer视图控制器。我所说的计时器无效当我删除视图控制器:

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

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

因此,我有两个问题:

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

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

感谢

利奥

+0

您应该在viewDidUnload下放置无效语句以避免崩溃。 –

+0

这听起来像是一些奇怪的行为。是否还有其他的对象持有对你的视图控制器的引用 - 如果没有,有没有可能,一旦定时器被从NSRunLoop中移除并释放,视图控制器就不再引用它了(所以被解除分配)? – Stuart

+0

@studev,你是对的。我只是认为视图控制器被错误地发布在这个代码的一面。计时器的无效将释放目标,但目标的dealloc不应该是呼叫。而保留计数应该从2减少到1.因为当我安排定时器时,计时器保留了目标。 – leo

回答

1

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

如果没有,有可能一旦定时器被删除,从运行循环中释放的视图控制器没有任何引用它(并且被释放)。

3

截至CocoaDev: NSTimer描述:

这里有一些规则,可能会帮助你的NSTimer:

定时器保留目标和userInfo对象。

定时器在计划时会自动保留在运行循环中。

如果定时器没有设置为重复,它会在发射时自动失效。

调用invalidate时,会从run循环中释放一个定时器。

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

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

+1

如果您复制并粘贴您自己没有编写过的内容,请引用原始来源并明确说明文本不属于您的内容。剽窃被诟病,可能被认为是非法的。 – 2011-09-15 10:59:41

+0

对不起....我不知道这是怎么完成的..我是一个新成员.. :)会记住这一点。 –