【问题标题】:How to stop NStimer event? [duplicate]如何停止 NStimer 事件? [复制]
【发布时间】:2009-09-15 20:56:32
【问题描述】:

可能重复:
NSTimer doesn't stop

在我的应用程序中,我使用 NStimer 每 3 秒调用一次动画函数。我想停止这个计时器并在计时器仍在运行时调用另一个事件。这可能吗?

【问题讨论】:

    标签: ios objective-c iphone nstimer


    【解决方案1】:
    @interface
        NSTimer *autoTimer;
    
    @implementation
    
    // Start timer
        autoTimer = [NSTimer scheduledTimerWithTimeInterval:(3.0)
            target:self 
            selector:@selector(autoTimerFired:) 
            userInfo:nil 
            repeats:YES];
    
    // Stop timer:
        [autoTimer invalidate];
        autoTimer = nil;
    

    【讨论】:

    • 在 Swift 中,当然是autoTimer.invalidate(),不需要设置为null
    • 在 Swift 中,如果你将它设置为 nil,定时器仍然可以触发。这发生在我身上。
    • 因此你应该INVALIDATE IT @kkazakov!
    【解决方案2】:

    首先,你要保留一个指向计时器的指针

    self.packetTimer = [NSTimer timerWithTimeInterval:CONNECTION_TIMEOUT target:self selector:@selector(connectionTimeout:) userInfo:nil repeats:NO];
    [[NSRunLoop currentRunLoop] addTimer:packetTimer forMode:NSDefaultRunLoopMode];
    

    如果您想在代码中的其他地方取消它,只需调用:

    [self.packetTimer invalidate];
    self.packetTimer = nil;
    

    【讨论】:

    • 你不应该在将计时器设置为 nil 之前释放它吗? invalidate 将导致运行循环释放它的引用,但是当它被分配给 packetTimer 时,这里还有一个额外的保留。
    • 嗯。这在我看来并不正确。 Sebatsien 是正确的 - 当您将计时器分配给 self.packetTimer(假设它是一个保留属性)时,就会有一个保留。将它添加到 runloop 是第二次保留。当您稍后将其无效时,内部会有一个版本。我认为您需要在无效之后和将 self.packetTimer 设置为 nil 之前明确 [self.packetTimer release}。我错了吗?
    • 是的,你错了。将其设置为 nil 会使用强引用(保留属性)释放它。
    • 啊哈!我从来不知道在声明要保留或复制的属性时,将属性设置为 nil 实际上会释放引擎盖下的属性。不过这是有道理的:这是一个很好的描述:stackoverflow.com/questions/785260/…。谢谢你的解释。
    • 虽然,在添加到run loop的时候,addTimer参数应该是self.packetTimer而不只是packetTimer。如果您刚刚合成了 packetTimer,因此“packetTimer”是 ivar,那么这没关系,但我总是使用 _ivar 而不是 ivar 作为我的 ivar。换句话说,@synthesize packetTimer = _packetTimer。使用 addTimer:self.packetTimer 可以完成这项工作。
    猜你喜欢
    • 2015-12-08
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多