以下方法导致崩溃。 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];
}
}
答案 0 :(得分:3)
我认为根本不需要拨打[NSTimer fire]
;它应该足以让计时器决定何时开火。
首先确保timer
为nil
(它应该是对象的实例变量),尽管在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:
而没有任何初始化来测试它...