2011-12-29 11 views
0

私はいくつかのタイマーを使用していますが、完了する前にキャンセルするか、終了後にビューから削除することができます。これらの両方は、cancelActionメソッドによって処理されるはずです。タイマーが終了していない場合、cancelActionのifステートメントはタイマーに無効化を指示し、ゼロにして残りの時間を表示するビューを削除します。これは完全に機能します。タイマーがすでに終了している場合、cancelActionはビューを削除するだけで、ビューを無効にしようとはしません。しかし、これは動作していないようです。終了する前にキャンセルするとすべてが機能し、終了後にキャンセルすると、認識できないセレクタがインスタンスに送信されたという例外がスローされます。両方のタイマーはscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:メソッドを使用して作成されましたCocoa:無効化時のNSTimer gdb

終了前または終了後の呼び出しの違いは、終了した場合、このメソッドが実行されることです。

- (void)timerFinished:(id)sender { 
[timer invalidate]; 
timer = nil; 
[timerLabelUpdater invalidate]; 
timerLabelUpdater = nil; 
} 

これは不思議なところです。私がちょうど[timerLaberUpdater invalidate]を取り除くと、メソッドが呼び出され、それが取り除かれます。そのタイマーは残った時間をカウントダウンし、時間を残してビューを更新するので、その行を削除したくありません。私がそれを無効にしなければ、それはネガティブにカウントダウンし続け、さらにそれはメモリを消費する。

なぜ私はその行を削除しても同じように変更されたタイマは何も変更されていないので、他の行を削​​除してもまだ動作しません。

gdbでEXC BAD ACCESSを取得しました。これは、セレクタがリリースされたインスタンスに送られることを意味します。

ありがとうございました。

+0

タイマーが_autorepeating_でない場合、タイマーが終了するとすぐに無効になります。それに加えて、実行ループはそれを解放するので、あなたは未だに 'EXC_BAD_ACCESS'をスローしている未割り当てのインスタンスに終わるかもしれません。 – alediaferia

+0

これはまさに私が起こっていると思っていたものです。実行ループからそれらを解放することはできますが、インスタンスの割り当てを解除することはできますか? – Elbimio

+0

- [scheduledTimer ...]メソッドを使用してタイマーを作成するときは、タイマーを保持しておく必要があります。これにより、無効化を呼び出すとautoreleasepoolによって割り当てが解除されず、自分で解放することができます。または、インスタンスのinitメソッドを使用してタイマーを作成することもできます。 – alediaferia

答えて

0
if([timerLabelUpdater isValid]) 
    [timerLabelUpdater invalidate];