2012-02-02 12 views
2

可能性の重複:
NSTimer doesn't stop(停止)NSTimerを無効にすることができません

オーディオが再生されている間、私は、スライダーの値を更新するNSTimerを使用しています。

if (sliderUpdateTimer) { 
    [sliderUpdateTimer invalidate]; 
    sliderUpdateTimer=nil; 
} 

sliderUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateSliderForAudio) userInfo:nil repeats:YES]; 

オーディオの再生が終了すると、私はaudioPlayerデリゲートメソッドのタイマーを無効にしています。

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ 
NSLog(@"audioPlayerDidFinishPlaying"); 
[player release]; 
audioPlayer=nil; 

[sliderUpdateTimer invalidate]; 
[sliderUpdateTimer release]; 
sliderUpdateTimer=nil; 

}

デリゲートメソッドが呼び出さなっているが、タイマーが停止されていません....私はタイマーをruningていた上で、私は一度だけスレッドいます。しかし、まだタイマーは止まらない....この点に関する助けが歓迎されている...

+0

をループし、何かがなければなりませんそれ以外は間違っている何を見ていますか?関数 'updateSliderForAudio'はまだ呼び出されていますか?どのように伝えることができますか?アプリがクラッシュしていますか? –

+0

どのメソッドに 'if(sliderUpdateTimer){...'コード??? –

+0

アプリがクラッシュすることはありません。しかし、updateSliderForAudioは、タイマーが無効化された後も継続的に呼び出されています。メソッドのlogステートメントはメソッドを無効化した後でも呼び出されています –

答えて

6

まず、あなたはそれをリリースするだろうし、EXC_BADACCESSを受け取るべきである(あなたは設定時にタイマーを保持していないあなたもそれを解放すべきではありません)。のみ呼び出す必要があります:

[sliderUpdateTimer invalidate]; 
sliderUpdateTimer=nil; 

をあなたがクラッシュを受信しないので、audioPlayerDidFinishPlaying:を呼び出すときsliderUpdateTimernilあるようです。ユーザーNSLog、またはこれが真であるかどうかを確認するためにブレークポイントを設定します。このような場合は、おそらくどこかでnilに設定して、slideUpdateTimerを検索し、どこで発生する可能性があるかを確認してください。

3

あなたのコードの第一セクションから以下の行を削除した後に試してみてください

if (sliderUpdateTimer){ 
    [sliderUpdateTimer invalidate]; 
    sliderUpdateTimer=nil; 
} 

あなたは保留中の自動解放して、そのオブジェクトを作成しているので、そのsliderUpdateTimerオブジェクト

に解放メッセージを呼び出す必要はありません。メッセージ

ここではこれらの行を使用する必要はありません。

私はこれがうまくいくと思います。

4

ねえ、私はあなただけの単一のスレッドを持って知っているが、2つの異なる走行があるかもしれません

- (void)stopTimer{ 
    [sliderUpdateTimer invalidate]; 
    //don't release it. as it is autoreleased. 
    //[sliderUpdateTimer release]; 
    sliderUpdateTimer=nil; 
} 


-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ 
    NSLog(@"audioPlayerDidFinishPlaying"); 
    [player release]; 
    audioPlayer=nil; 
    [self performSelectorOnMainThread:@selector(stopTimer) withObject:nil waitUntilDone:NO]; 
} 

...この事を試すには、タイマーを停止させる正しい方法であること

関連する問題