Iphone 停止时间间隔不断增加

Iphone 停止时间间隔不断增加,iphone,ios,objective-c,nstimer,Iphone,Ios,Objective C,Nstimer,我的倒计时计时器有个奇怪的问题。该计时器从设定时间(即60秒)开始倒计时。这段代码放在myViewDidLoad方法中。除非我返回并再次加载视图,否则一切都正常。每次加载视图时,倒计时都会增加1秒 例如: 第一次加载:60、59、58 第二次加载:60、58、56 第三次加载:60、57、54 我的代码如下。有人知道为什么会这样吗?我需要在什么地方发布一些东西吗?谢谢大家! countDown=[NSTimer scheduledTimerWithTimeInterval:1.0 target:

我的倒计时计时器有个奇怪的问题。该计时器从设定时间(即60秒)开始倒计时。这段代码放在myViewDidLoad方法中。除非我返回并再次加载视图,否则一切都正常。每次加载视图时,倒计时都会增加1秒

例如:

  • 第一次加载:60、59、58
  • 第二次加载:60、58、56
  • 第三次加载:60、57、54
  • 我的代码如下。有人知道为什么会这样吗?我需要在什么地方发布一些东西吗?谢谢大家!

    countDown=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self 
    selector:@selector(TimeOver) userInfo:nil repeats:YES];
    

    每次加载视图时,都会创建一个新计时器,但旧计时器仍然存在。在计时器的操作方法中,
    TimeOver
    ,您正在递减一个跟踪秒数的索引变量,并且每个计时器每次触发时都运行该方法。因此,如果有三个计时器,则每次索引将减少三

    您需要在视图加载时不创建新的计时器,或者在视图消失时销毁计时器:

    [countDown invalidate];
    countdown = nil;
    
    当它再次出现时重新创建它

    另外,请注意计时器的动作方法具有不正确的签名。它应该是一个不返回任何内容并接受一个参数的方法,即计时器本身,如下所示:

    - (void)timeOver: (NSTimer *)tim;
    

    另外,Cocoa方法不应该以大写字母开头。

    每次加载视图时,您都会创建一个新的计时器,但旧的计时器仍然存在。在计时器的操作方法中,
    TimeOver
    ,您正在递减一个跟踪秒数的索引变量,并且每个计时器每次触发时都运行该方法。因此,如果有三个计时器,则每次索引将减少三

    您需要在视图加载时不创建新的计时器,或者在视图消失时销毁计时器:

    [countDown invalidate];
    countdown = nil;
    
    当它再次出现时重新创建它

    另外,请注意计时器的动作方法具有不正确的签名。它应该是一个不返回任何内容并接受一个参数的方法,即计时器本身,如下所示:

    - (void)timeOver: (NSTimer *)tim;
    

    另外,Cocoa方法不应该以大写字母开头。

    谢谢Josh,我会试试的。无效代码应该放在viewdidUnLoad中?是否可以在viewdidload中使它的所有实例无效,然后在方法的下一步创建它的新实例?是的,但是如果您需要在视图不可见的情况下运行计时器,则完全没有必要销毁它。只需检查它是否已经存在,不要创建新的。好的,我来试一试。谢谢大家!@布兰登:我同意本杰明的观点,
    viewDidUnload
    不是个好地方。它不仅在iOS 6中被弃用,而且具有讽刺意味的是,它在iOS 5和更早版本中也不好,因为它只在内存不足的情况下调用,而不是在视图被释放和释放的典型操作中调用。您可以在
    视图中加载计时器,然后在
    视图中删除计时器,计时器将消失。谢谢Josh,我会尝试一下。无效代码应该放在viewdidUnLoad中?是否可以在viewdidload中使它的所有实例无效,然后在方法的下一步创建它的新实例?是的,但是如果您需要在视图不可见的情况下运行计时器,则完全没有必要销毁它。只需检查它是否已经存在,不要创建新的。好的,我来试一试。谢谢大家!@布兰登:我同意本杰明的观点,
    viewDidUnload
    不是个好地方。它不仅在iOS 6中被弃用,而且具有讽刺意味的是,它在iOS 5和更早版本中也不好,因为它只在内存不足的情况下调用,而不是在视图被释放和释放的典型操作中调用。您可以在
    视图中加载计时器,然后在
    视图中删除计时器,计时器将消失。