2012-05-02 13 views
0

方法の単純化されたセットを何が起こっているかを証明するために:NSTimerは無効 - 重複タイマー

- (void)timerDidFire { 
    NSLog(@"fire"); 
} 

- (void)resetTimer:(NSTimer *)timer { 
    if (timer) [timer invalidate]; // timer = nil; here doesn't change anything 
    NSLog(@"%@", timer); 
    timer = [NSTimer ...Interval:1 ... repeats:YES]; 
} 

- (IBAction)pressButton { 
    [self resetTimer:myTimer]; 
} 

私が何か間違ったことをやっているのクリアが、何?すべてのプレスで余分なタイマーを取得するのはなぜですか?

答えて

2

resetTimer:メソッドが呼び出されるたびに、新しいNSTimerインスタンスを作成します。残念ながら、このメソッドの実行が終了した後、新しいインスタンスがローカル変数に割り当てられたため、そのインスタンスへの参照はすべて失われました。
メソッド内で作成するタイマーは、myTimer変数に割り当てられません。 myTimerがどんなものであれ、新しい作成されたタイマーではありません。

あなたはこれらすべてのローカル変数をダンプし、単にこのような何か使用することができます:私はそれがそのようなものかもしれないと思った

- (void)resetTimer { 
    [myTimer invalidate]; // calls to nil are legal, so no need to check before calling invalidate 
    NSLog(@"%@", myTimer); 
    myTimer = [NSTimer ...Interval:1 ... repeats:YES]; 
} 

- (IBAction)pressButton { 
    [self resetTimer]; 
} 
+0

を。愚かな間違い。なぜ私はローカル変数が何かをすると思ったのか分かりません。 – Thromordyn

関連する問題