NSTimer导致崩溃

时间:2012-05-04 08:13:12

标签: iphone ios xcode crash nstimer

以下方法导致崩溃。 UI就像一个按钮,它处理NSTimer的启动/停止功能。如果计时器运行,则更新UILabel。使用viewDidLoad方法使我的计时器工作,停止它也可以工作,但再次启动它会使应用程序崩溃。

在viewDidLoad方法中删除alloc并尝试使用启动按钮会立即导致崩溃。即使NSLog(@"Start now");也未被调用。

代码:

- (void)tick {
NSLog(@"tick");
float value = [moneyLabel.text floatValue];
moneyLabel.text = [NSString stringWithFormat:@"%f", value + 1.0];

}

- (IBAction)startStopButtonClicked:(UIButton *)sender {
if ([sender.titleLabel.text isEqualToString:@"Start"]) {
    NSLog(@"Start now");
    if (timer) {
        NSLog(@"Timer valid");
        [timer fire];
    } else {
        NSLog(@"Timer is nil");
        timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(tick) userInfo:nil repeats:YES];
        [timer fire];
    }

    NSLog(@"bla");

    [sender setTitle:@"Stop" forState:UIControlStateNormal];
} else {
    [timer invalidate];
    timer = nil;
    NSLog(@"Stopped.");
    NSLog(@"Timer isValid: %@", timer);
    [sender setTitle:@"Start" forState:UIControlStateNormal];
}
}

2 个答案:

答案 0 :(得分:3)

我认为根本不需要拨打[NSTimer fire];它应该足以让计时器决定何时开火。

首先确保timernil(它应该是对象的实例变量),尽管在nil中明确将其设置为- (id)init不会伤。

接下来我会使用计时器本身的状态来确定是否按下了开始/停止,而不是按钮中的文字:

- (IBAction)startStopButtonClicked:(UIButton *)sender
{
    if (timer != nil)
    {
        NSLog(@"Stopping timer");
        [timer invalidate];
        timer = nil;
    }
    else
    {
        NSLog(@"Starting timer");
        timer = [NSTimer scheduledTimerWithTimeInterval:1
                                                 target:self
                                               selector:@selector(tick)
                                               userInfo:nil
                                                repeats:YES];
    }

    [sender setTitle:(timer != nil ? @"Stop" : @"Start")
            forState:UIControlStateNormal];
}

答案 1 :(得分:0)

您发布的代码按照需要工作 - 只是在新项目中测试它,因此问题可能在其他地方。我只是通过在NSTimer *timer;或指定的初始化程序中声明ivar viewDidLoad:而没有任何初始化来测试它...