2012-01-03 2 views
1

これは私が解決できなかった長い間残っている問題です。 私は一連の小さなオーディオファイルを再生しようとしています。しかし、私がAVAudioPlayerをリリースしないと、私はメモリリークを取得します。もしそれをリリースすれば、ファイルはまったく再生されません。メモリリークのないNSTimerでAVAudioPlayerを再生しますか?

私は自動解放を試みましたが、何も機能しません。

- (void) playSoundShowLabel:(NSTimer*)theTimer { 

    NSMutableDictionary *dict = [[[NSMutableDictionary alloc] 
     initWithDictionary:[theTimer userInfo]] autorelease]; 

    NSURL *clickURL = [NSURL fileURLWithPath:[NSString 
     stringWithFormat:@"%@/%@.mp3", [[NSBundle mainBundle] resourcePath], 
     [dict valueForKey:@"sWav"]]]; 

    AVAudioPlayer *theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: 
     clickURL error:nil]; 

    [theAudio play]; 
    theAudio.numberOfLoops = 0; 
    //[theAudio release]; << stops play 
} 

私は、システムサウンドでファイルを再生する他の方法を試してみましたが、私はこれと他の問題を取得するので、私はAVAudioPlayerを使用する必要があります。

私はこれをグーグルが、答えを見つけることができます:(

答えて

1

プレイヤーのためのインスタンス変数を使用すると、オーディオが行われているか、中止されるべきであるまで、それは有効なままにしてください。前者

を、そのデリゲートを使用する - 後者のために、viewDidUnloadかにdeallocを使用して今の

、私はあなたがARCを使用していないことを想定しています...

をお使いのインタフェース宣言の中で:

。あなたのクラスの実装内
@interface HoldingThePlayerSomeViewController : UIViewController <AVAudioPlayerDelegate> 
{ 
    AVAudioPlayer *theAudio; 
} 

:あなたは再生が完了したときにバックと呼ばれる取得するためにAVAudioPlayerDelegateを作成する必要が

- (void) playSoundShowLabel:(NSTimer*)theTimer 
{ 
    NSMutableDictionary *dict = [[[NSMutableDictionary alloc] 
     initWithDictionary:[theTimer userInfo]] autorelease]; 

    NSURL *clickURL = [NSURL fileURLWithPath:[NSString 
     stringWithFormat:@"%@/%@.mp3", [[NSBundle mainBundle] resourcePath], 
     [dict valueForKey:@"sWav"]]]; 

    [theAudio release]; 
    theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: 
     clickURL error:nil]; 
    theAudio.delegate = self; 

    [theAudio play]; 
    theAudio.numberOfLoops = 0; 
} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag 
{ 
    if (player == theAudio) 
    { 
     [theAudio release]; 
     theAudio = nil; 
    } 
} 

- (void)dealloc 
{ 
    [theAudio release]; 
    [super dealloc]; 
} 
0

。そこにあなたのAVAudioPlayerの割り当てを解除することができます。

関連する問題