次のメソッドはクラッシュを引き起こします。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];
}
}