Iphone Dealloc呼叫了两次并在[super Dealloc]崩溃
----问题由我自己解决,信息在我的评论中更新---- 我有一个视图控制器,它有一个周期性的NSTimer。移除视图控制器时,我调用计时器的invalidate:Iphone Dealloc呼叫了两次并在[super Dealloc]崩溃,iphone,objective-c,cocoa-touch,ipad,nstimer,Iphone,Objective C,Cocoa Touch,Ipad,Nstimer,----问题由我自己解决,信息在我的评论中更新---- 我有一个视图控制器,它有一个周期性的NSTimer。移除视图控制器时,我调用计时器的invalidate: - (void)dealloc { NSLog(@"dealloc called"); if ([myTimer isValid]) { [myTimer invalidate]; } [super dealloc]; } 我发现一个意外的行为,[myTimer invalidate
- (void)dealloc
{
NSLog(@"dealloc called");
if ([myTimer isValid]) {
[myTimer invalidate];
}
[super dealloc];
}
我发现一个意外的行为,[myTimer invalidate]将立即调用我的视图控制器的dealloc。这就是为什么我要用isValid来避免崩溃。但是[super dealloc]将被调用两次并导致应用程序崩溃
因此,我有两个问题:
听起来有点奇怪。是否有其他对象保留对视图控制器的引用
如果没有,那么一旦计时器从运行循环中移除并释放,视图控制器就可能不再引用它(因此被释放)。这听起来像是某种奇怪的行为。是否有其他对象保留对视图控制器的引用
否则,一旦计时器从运行循环中移除并释放,视图控制器就可能不再引用它(因此被释放)。您应该在viewDidUnload下放置invalidate语句以避免崩溃。这听起来像是一些奇怪的行为。是否有任何其他对象保留对视图控制器的引用?如果没有,则一旦计时器从
nsrunlop
中移除并释放,视图控制器就没有任何引用它的内容了(因此被解除分配)?@studev,您是对的。我只是觉得视图控制器被错误地释放到了代码之外。计时器的INVALIDE将释放目标,但目标的dealloc不应被调用。相反,保留计数应该从2减少到1。因为当我安排计时器时,计时器保留了目标。好的,很高兴听到-我将添加我的注释作为答案。你应该在viewDidUnload下放置invalidate语句以避免崩溃。这听起来像是一些奇怪的行为。是否有任何其他对象保留对视图控制器的引用?如果没有,则一旦计时器从nsrunlop
中移除并释放,视图控制器就没有任何引用它的内容了(因此被解除分配)?@studev,您是对的。我只是觉得视图控制器被错误地释放到了代码之外。计时器的INVALIDE将释放目标,但目标的dealloc不应被调用。相反,保留计数应该从2减少到1。因为当我安排计时器时,计时器保留了目标。好的,很高兴听到-我将添加我的评论作为回答。如果你复制并粘贴了你自己没有写的内容,请引用原始来源,并明确说明文本不是你的。剽窃是不受欢迎的,可能被认为是非法的。。。。我不知道这是怎么做到的。。我是新会员……)如果你复制粘贴的内容不是你自己写的,请引用原始来源,并明确说明文本不是你的。剽窃是不受欢迎的,可能被认为是非法的。。。。我不知道这是怎么做到的。。我是新会员……)我会记住这一点。