Iphone 如何在objective-c中取消NSTimer计划

Iphone 如何在objective-c中取消NSTimer计划,iphone,objective-c,static,timer,Iphone,Objective C,Static,Timer,我正在应用程序中使用嵌套的NSTimer。我这里有两个问题 如何在此函数中重新启动时间计数器-(void)updateLeftTime:(NSTimer*)计时器 如何终止前一个计时器,因为计时器也在调用计时器 要重置计时器时,请添加以下行 [tmLeftTime invalidate]; tmLeftTime = nil; 你也可以使用 if ([tmLeftTime isValid]){ // the timer is valid and running, how about in

我正在应用程序中使用嵌套的NSTimer。我这里有两个问题

  • 如何在此函数中重新启动时间计数器
    -(void)updateLeftTime:(NSTimer*)计时器
  • 如何终止前一个计时器,因为计时器也在调用计时器


  • 要重置计时器时,请添加以下行

    [tmLeftTime invalidate]; 
    tmLeftTime = nil;
    
    你也可以使用

    if ([tmLeftTime isValid]){
      // the timer is valid and running, how about invalidating it
      [tmLeftTime invalidate]; 
        tmLeftTime = nil;
    }
    

    用一个计时器代替3个怎么样

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
    }
    
    - (void)updateLevel {
        static int count = 1;
        count += 1;
    
        lblLevel.text = [NSString stringWithFormat:@"%d", count];
    
        tfLeftTime.text=[NSString stringWithFormat:@"%d",ANSWER_TIME];
    
        [self playMusic];
    
    }
    - (void)updateLeftTime:(NSTimer *)theTimer {
        static int timeCounter=1;
        timeCounter+=1;
        tfLeftTime.text=[NSString stringWithFormat:@"%d", (ANSWER_TIME-timeCounter)];
        if (timeCounter >= ANSWER_TIME) {
            timeCounter = 0;
            [self updateLevel];
        }
    }
    

    使用updateLevel:方法中的Invalidate方法使计时器无效,并重新安排相同的计时器

    [tmLevel invalidate];
    tmLevel = [NSTimer scheduledTimerWithTimeInterval:20.0f target:self selector:@selector(updateLevel:) userInfo:nil repeats:YES];
    
    如果你想调用updateTimeLeft:方法,你不需要分配另一个计时器,这是一个很大的漏洞,因为你从来没有释放过那些引用

    tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
    
    在updateTimeLeft中:只需重新安排计时器的方法,并设置一个应该停止的条件

    tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
    
    • 使用
      [tmLevel invalidate]
      取消计时器的计划
    • 不要忘记在之后立即设置
      tmLevel=nil
      (避免在运行循环未计划和释放计时器后使用变量)
    • 在失去对tmLevel计时器的引用之前,不要忘记使其无效,即在将新的NSTimer分配给tmLevel变量之前调用
      [tmLevel invalidate]
      (否则,除新的计时器外,上一个计时器将继续运行)
    还要注意的是,在代码中有一些无用的分配,这些分配还会造成泄漏:

    tmLeftTime=[[NSTimer alloc] init];
    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES];
    
    在这里分配一个NSTimer实例,将该实例存储在
    tmLeftTime
    中。。。然后立即忘记这个创建的实例,将其替换为另一个实例,该实例是使用
    [NSTimer scheduledTimerWithTimeInterval:…]创建的。
    ! 因此,使用
    [[NSTimer alloc]init]
    创建的NSTimer将丢失,并且正在创建泄漏(因为它永远不会被释放)

    你的第一句话完全没用,有点像你在做的

    int x = 5;
    x = 12; // of course the value "5" is lost, replaced by the new value
    

    哦我明白了,但实际上我还处于中级阶段,所以代码不合适,我必须在完成一个等级后恢复它,而一个等级有20个问题。完成一个等级后,我必须展示一个广告。因此,我必须以这种方式重新启动它。多谢各位
    int x = 5;
    x = 12; // of course the value "5" is lost, replaced by the new value