AVAudioPlayer泄漏并发出警告,最后我的应用程序崩溃了

时间:2011-05-04 17:05:46

标签: iphone memory-leaks audio avaudioplayer

我正在使用AVAudioPlayer,我再次使用声音和agian并在我的应用程序中调用此方法100次。问题是我总是alooc它但是当我要发布时,声音不起作用。 我该怎么办。

-(void) ButtonSound
{

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Button1" 
         ofType:@"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[player play];
[fileURL release];

}

内存泄漏且应用程序崩溃,我想立即分配播放器并一次又一次地使用它。

3 个答案:

答案 0 :(得分:4)

你可以这样做

在你的头文件上,声明播放器已经

AVAudioPlayer *buttonSoundPlayer;

然后执行

-(void)playButtonSound {
    if(buttonSoundPlayer == nil) {
       NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Button1" ofType:@"mp3"];
       NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];
       buttonSoundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
       [fileURL release];
    }
    [buttonSoundPlayer play];
}

答案 1 :(得分:1)

将您的代码更改为:

-(void) ButtonSound
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Button1" 
         ofType:@"mp3"];
    NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:filePath];
    if (player) {
        [player release];
    }
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
    [player play];
    [fileURL release];
}

您还需要在player方法中发布dealloc。您也可能需要在单击按钮时检查player是否已在播放,如果是这样,可能会跳过此方法。

您可能还需要retain您的玩家对象,但这取决于您的声明方式(未在示例中显示)。

答案 2 :(得分:0)

-(void) ButtonSound
{

    NSBundle        *mainBundle = [NSBundle mainBundle];
    NSError         *error;
    NSURL           *audioURL = [NSURL fileURLWithPath:[mainBundle pathForResource:@"Button1" ofType: @"mp3"]];
    AVAudioPlayer   *player1 = [(AVAudioPlayer*) [AVAudioPlayer alloc] initWithContentsOfURL:audioURL error:&error];
    self.player =   player1;
    [self.player play];
    [player1 release];
}

此代码没有错误,我没有发现任何泄漏使用此代码