AVAudioPlayer Leak and Crash - PullRequest
       13

AVAudioPlayer Leak and Crash

0 голосов
/ 22 февраля 2011

Я хочу воспроизвести несколько аудиофайлов (.WAV), используя IBAction и AVAudioPlayer.К сожалению, звук воспроизводится, но если я много раз воспроизводю звук, мое приложение вылетает.Вы можете мне помочь?

Вот мой код.

ViewController.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>

@interface ViewController : UIViewController <AVAudioPlayerDelegate>
{
    NSString        *Path;
}

- (IBAction)Sound1;
- (IBAction)Sound2;
- (IBAction)Sound3;
- (IBAction)Sound4;

@end

ViewController.m

#import <AVFoundation/AVAudioPlayer.h>
#import "ViewController.h"

@implementation ViewController

AVAudioPlayer *Media;

- (IBAction)Sound1
{
    Path = [[NSBundle mainBundle] pathForResource:@"Sound1" ofType:@"wav"];
    Media = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:Path] error:NULL];
    [Media setDelegate:self];
    [Media play];
}

- (IBAction)Sound2
{
    Path = [[NSBundle mainBundle] pathForResource:@"Sound2" ofType:@"wav"];
    Media = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:Path] error:NULL];
    [Media setDelegate:self];
    [Media play];
}

- (IBAction)Sound3
{
    Path = [[NSBundle mainBundle] pathForResource:@"Sound3" ofType:@"wav"];
    Media = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:Path] error:NULL];
    [Media setDelegate:self];
    [Media play];
}

- (IBAction)Sound4
{
    Path = [[NSBundle mainBundle] pathForResource:@"Sound4" ofType:@"wav"];
    Media = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:Path] error:NULL];
    [Media setDelegate:self];
    [Media play];
}

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
}

- (void)dealloc
{
    [Media Release];
    [super dealloc];
}

@end

1 Ответ

2 голосов
/ 22 февраля 2011

Есть несколько вещей, которые выглядят неправильно в вашем коде:

(1).Нет метода Release, [Media Release] должно быть [Media release];

(2).Если вы воспроизводите Sound2, пока Sound1 все еще воспроизводится, вы теряете экземпляр Media:

Media = [[AVAudioPlayer alloc] initWithContentsOfURL:...
  

Это выделяет нового игрока и перезаписывает старый, не выпуская его первым;

(3).Обычно плохая идея освобождать вызывающий объект в делегате;

(4).Я бы также предложил переименовать Media в media и Path в path.

Таким образом, игровое действие должно выглядеть следующим образом:


- (IBAction)playSound1
{
    path = [[NSBundle mainBundle] pathForResource:@"Sound1" ofType:@"wav"];
    media = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
    [media play];
    [media release];
}
...