2012-05-04 12 views
0

次の方法でクラッシュします。 UIは、NSTimerの開始/停止機能を処理するボタンのようなものです。タイマーが実行されると、UILabelが更新されます。 viewDidLoadメソッドを使用すると、私のタイマーは動作し、動作も停止しますが、再び起動するとアプリケーションがクラッシュします。NSTimerがクラッシュする

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]; 
} 
} 
+1

クラッシュログを投稿してください。 – Devang

+0

はいplzは私たちがあなたを助けることができるようにあなたのクラッシュログを投稿します... – sandy

+0

***キャッチされない例外 'NSInvalidArgumentException'、理由: ' - [__ NSCFArray startStopButtonClicked:]:インスタンス0x683d8e0' – DAS

答えて

0

必要に応じて、あなたが作品を掲載しているコードは - ちょうどそれをテスト新しいプロジェクトでは、問題はどこか別の場所にある可能性があります。私はviewDidLoad:または指定されたイニシャライザでイニシャルNSTimer *timer;を初期化せずに宣言するだけでテストしました...

+1

問題は、AppDelegateでrootViewControllerを追加していませんでした。 WTF。 – DAS

3

私は全く[NSTimer fire]を呼び出す必要は表示されません。タイマーがいつ発射するかを決定するのに十分でなければなりません。

まず明示的- (id)initnilに設定するもののtimerは、(それは、オブジェクトのインスタンス変数だ場合、それがあるべき)nilであることを確実に傷つけることはありません。

次の私は、スタート/ストップが押されたかどうかを判断するためにタイマー自体の状態を使用し、ボタンのテキストではない:

- (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]; 
} 
+0

**に送信されたセレクタ*未知の例外 'NSInvalidArgumentException'、理由: ' - [__ NSCFArray startStopButtonClicked:]:インスタンス0x683d8e0に送信された認識できないセレクタ' – DAS

+0

@ダーウィンあなたが投稿したコードの外でクラッシュのように見えます。もう一つの答えは、このコードが動作することを示しているようですが、間違った場所を探しているようです。 – trojanfoe

+0

私のプロジェクトでこれ以外のコードはありません...他のものはviewDidLoadのような標準です。どのような混乱... – DAS