2011-07-19 1 views
2

繰り返しなしでNSTimerを作成する際に問題があります。 NSTimerの自動無効化が行われたかどうかを確認する方法は?

は、私は私のコードのどこかで新しいインスタンス

timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(updateSystems) userInfo:nil repeats:NO];

を作成して想像してみてください。

私はiPhoneのホームボタンを押すと、私のアプリはバックグラウンドの状態になり、タイマーはまだ周囲にあり、一時停止します。だから私のapplicationDidEnterBackground方法で私は、タイマーが完了した後、私はホームボタンを押した場合、問題が発生し

if(timer.isValid == YES) 
{ 
    [timer invalidate]; 
    timer = nil; 
} 

を言います。その後、タイマーが解放され、isValidにアクセスしようとするとクラッシュします。ココアの自動無効化がnilにタイマーを設定していないようですので、同じ事故で

if(timer != nil) 
{ 
    [timer invalidate]; 
    timer = nil; 
} 

結果を、しようと

タイマーが自動無効化されているかどうかを確認するにはどうすればよいですか?

ありがとうございます。

注:私はこれを行う必要がある理由は、要求が成功した(または失敗した)Webサービスにリクエストを送信しているからです。新しいリクエストを送信するタイマーを開始します発砲した。終了する前にタイマーを無効にしないと、1つだけが必要なときに複数の要求を行う(私はapplicationDidBecomeActiveで新しい要求を出しているので)いくつかのタイマーが作成されます。

答えて

3

タイマーを放置してから、まだ起動していることを保証する必要があります。 scheduledTimerWithTimeIntervalは、あなたが所有していない自動リリースされたインスタンスを返します。

+0

私はそれがまだ周囲にあることを望んでいない、私はちょうどそれがまだ周りを確認したい。 –

+1

ポインタがまだ有効なobjective-cオブジェクトを保持しているかどうかを調べる簡単な方法はありません。タイマーを正しい方法で保持してください。オブジェクトを保持している何かがそれを解放したときにクラッシュするのを防ぐために、後でアクセスしたいオブジェクトを常に保持する必要があります。 – Bastian

+0

したがって、私はタイマーを保持して、auto-invalidateがアクセスされていないことがわかっている場合、保持カウントが1より大きいかどうかを確認する必要があります。タイマーが別のスレッドで実行されているため、いくつかのタイミングに問題がある可能性があります。保持カウント条件をチェックし、1より大きいと判断した場合、条件に基づいて処理を実行する前に自動無効化が実行される可能性はありますか? –

関連する問題