2012-04-30 7 views
0

私はタイマーをviewDidLoadから呼び出しています。タイマがセレクタを初めて呼び出すとき、期待される結果は良好です。しかし、呼び出しが行われると、関数は何らかの理由でセレクタによって何度も呼び出されます。出力の数が増えていることを示すNSLogを記録しました。私は以下のコードを持っています。状況が明らかになることを願っています。NSTimerがセレクタ関数を何回も呼び出さないようにするにはどうしたらいいですか?

-(void)viewDidLoad 
{ 
    remainingTicks = 10; 
    [self updateLabel]; 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
         target:self 
         selector:@selector(handleTimerTick) 
         userInfo:nil 
         repeats:YES]; 
} 

-(void)handleTimerTick 
{ 
    remainingTicks--; 
    [self updateLabel]; 
    if (remainingTicks <= 0) { 
     [myTimer invalidate]; 
     myTimer = nil; 
     UIButton *but = [[UIButton alloc] init]; 
     if (answerAt == 0) { 
      [buttonA setBackgroundColor:[UIColor greenColor]]; 
     } 
     else if (answerAt == 1) { 
      [buttonB setBackgroundColor:[UIColor greenColor]]; 
     } 
     else if (answerAt == 2) { 
      [buttonC setBackgroundColor:[UIColor greenColor]]; 
     } 
     else { 
      [buttonD setBackgroundColor:[UIColor greenColor]]; 
     } 

     [self performSelector:@selector(next:) withObject:but afterDelay:1.5 ];  
    } 
} 

-(void)updateLabel 
{ 
    timerLabel.text = [[NSNumber numberWithUnsignedInt: remainingTicks] stringValue]; 
} 
+0

ログ出力を投稿できますか? 'UIButton * but = [[UIButton alloc] init];' 1)ボタンがビューに追加されていません。2)確かにメモリがリークしていますか? – trojanfoe

+0

ARCを使用している場合は、漏れていません。 –

答えて

0

ViewDidLoadUIViewControllerの存続期間中に複数回呼び出すことができます(たとえば、あなたがメモリの警告を取得し、あなたのビューが表示されていない場合、コントローラは、それを解放し、それをそれが必要なのは次回にリロードされます)。適切にこの動作を処理するために、次のいずれかをすべき:

A)タイマーが1を作成する前に存在しているかどうかをテストします(例えばif (myTimer == nil) { /* initialize the timer */ }

または

B)をクリアあなたのviewDidUnload方法でタイマー。 (これはおそらくタイマーに不可視のビューに関連するイベントを発生させたくないので、おそらくあなたが望むもののラインに沿っているでしょう)。

__weak Object *weakSelf = self; 
[NSTimer scheduledTimerWithTimeInterval:5.f target:weakSelf selector:@selector(actionMethod) userInfo:nil repeats:YES]; 

複数回呼び出されるアクションを防ぐことができます:NSTimerのターゲット

+0

リソースやタイマーを 'viewDidLoad'に割り当てることは大丈夫だと思います。しかし、それらのリリースを 'viewDidUnload'で処理しなければなりません。この場合、viewDidUnloadでは、タイマーを無効にする必要があります。 –

+0

良い点。それに応じて私の答えを変更しました。 – Mattia

0

セットが、このような弱い自己変数であると。

関連する問題