Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Dealloc呼叫了两次并在[super Dealloc]崩溃_Iphone_Objective C_Cocoa Touch_Ipad_Nstimer - Fatal编程技术网

Iphone Dealloc呼叫了两次并在[super Dealloc]崩溃

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

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

我有一个视图控制器,它有一个周期性的NSTimer。移除视图控制器时,我调用计时器的invalidate:

- (void)dealloc
{
    NSLog(@"dealloc called");
    if ([myTimer isValid]) {
        [myTimer invalidate];
    }
    [super dealloc];
} 
我发现一个意外的行为,[myTimer invalidate]将立即调用我的视图控制器的dealloc。这就是为什么我要用isValid来避免崩溃。但是[super dealloc]将被调用两次并导致应用程序崩溃

因此,我有两个问题:

  • 使计时器失效的正确方法是什么

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

  • 谢谢

    Leo

    如所述:

    以下是一些可能有助于您使用NSTimer的规则:

    计时器保留目标和用户信息对象

    调度计时器时,运行循环会自动保留计时器

    如果计时器未设置为重复,它将在触发时自动失效

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

    当调用invalidate时,计时器释放目标和userInfo对象

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

    如所述:

    以下是一些可能有助于您使用NSTimer的规则:

    计时器保留目标和用户信息对象

    调度计时器时,运行循环会自动保留计时器

    如果计时器未设置为重复,它将在触发时自动失效

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

    当调用invalidate时,计时器释放目标和userInfo对象

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


    听起来有点奇怪。是否有其他对象保留对视图控制器的引用


    如果没有,那么一旦计时器从运行循环中移除并释放,视图控制器就可能不再引用它(因此被释放)。

    这听起来像是某种奇怪的行为。是否有其他对象保留对视图控制器的引用


    否则,一旦计时器从运行循环中移除并释放,视图控制器就可能不再引用它(因此被释放)。

    您应该在viewDidUnload下放置invalidate语句以避免崩溃。这听起来像是一些奇怪的行为。是否有任何其他对象保留对视图控制器的引用?如果没有,则一旦计时器从
    nsrunlop
    中移除并释放,视图控制器就没有任何引用它的内容了(因此被解除分配)?@studev,您是对的。我只是觉得视图控制器被错误地释放到了代码之外。计时器的INVALIDE将释放目标,但目标的dealloc不应被调用。相反,保留计数应该从2减少到1。因为当我安排计时器时,计时器保留了目标。好的,很高兴听到-我将添加我的注释作为答案。你应该在viewDidUnload下放置invalidate语句以避免崩溃。这听起来像是一些奇怪的行为。是否有任何其他对象保留对视图控制器的引用?如果没有,则一旦计时器从
    nsrunlop
    中移除并释放,视图控制器就没有任何引用它的内容了(因此被解除分配)?@studev,您是对的。我只是觉得视图控制器被错误地释放到了代码之外。计时器的INVALIDE将释放目标,但目标的dealloc不应被调用。相反,保留计数应该从2减少到1。因为当我安排计时器时,计时器保留了目标。好的,很高兴听到-我将添加我的评论作为回答。如果你复制并粘贴了你自己没有写的内容,请引用原始来源,并明确说明文本不是你的。剽窃是不受欢迎的,可能被认为是非法的。。。。我不知道这是怎么做到的。。我是新会员……)如果你复制粘贴的内容不是你自己写的,请引用原始来源,并明确说明文本不是你的。剽窃是不受欢迎的,可能被认为是非法的。。。。我不知道这是怎么做到的。。我是新会员……)我会记住这一点。