NSTimer没有失效。

时间:2011-07-30 03:13:39

标签: objective-c cocoa-touch

我正在编写一个iPhone应用程序,用于指定用户按住按钮的时间。当用户'触摸'时,会触发buttonPressed方法,当按钮被重新释放时,又不再被保持,NSTimer应该无效。然而,事实并非如此,我很难找到解决方案。非常困难。希望你们能帮忙!这是代码:

-(IBAction)buttonReleased:(id)sender {


[stopWatchTimer invalidate];

NSString *label0 = @"0";
[labelText setText:label0];
score--;

NSString *scoreMessage =[[NSString alloc] initWithFormat:@"YOU LOSE! Your score was: %i",score];

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"GAME OVER!" message:(NSString *)scoreMessage delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];

[alert show];
[alert release];

score = 0;
tap = 0;

}

- (void)updateTimer
{
    static NSInteger counter = 0;
    labelText.text = [NSString stringWithFormat:@"%d", counter++];
    score++;

}

-(IBAction)buttonPressed:(id)sender {


        stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/1.0 target:self selector:@selector(updateTimer)userInfo:nil repeats:YES];
        tap++;

}

1 个答案:

答案 0 :(得分:1)

究竟是什么叫buttonReleased:?按钮可以通过多种方式停止按下。例如,修饰可能位于按钮的内部或外部。

我强烈怀疑buttonPressed:buttonReleased:更频繁地被召唤。因为你是直接访问你的ivars而不是使用访问器,所以你没有正确处理这个问题,并且当你分配一个新的计时器时,你可能会离开旧的计时器。

首先,始终使用访问者。不要直接混淆ivars(例外情况在initdealloc和访问者本身)。像这样的许多问题都来自直接搞乱ivars。 (另外,它使代码混乱。score是本地的,全局的还是ivar?)

其次,NSTimer setter应如下所示:

- (void)setTimer:(NSTimer *)aTimer {
  if (aTimer != timer_) {
    [timer_ invalidate];
    [timer_ release];
    timer_ = [aTimer retain];
  }
}

这可确保在更换计时器时使旧计时器无效。 if()检查对于您调用等效self.timer = self.timer的可能性非常重要。如果你在没有if()检查的情况下做到这一点,那么当你不打算这样做时,你会使计时器失效。