Ошибка в классе AVAudioPlayer? - PullRequest
2 голосов
/ 01 июля 2010

Я буду коротким и приятным - я создаю приложение только для практики, прежде чем купить себе программу для разработчиков iPhone.

Я экспериментирую с AVFoundation.framework и продолжаю сталкиватьсяошибка, которая позволяет мне проигрывать только первый звук, который я инициализирую в своем коде.Как вы думаете, кто-нибудь из вас может мне помочь?Заранее спасибо!!:)

просмотр контроллера

-(IBAction)play {
    if (segments.selectedSegmentIndex == 0) {
        NSLog(@"Segment = 0");
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *path = [bundle pathForResource:@"meow" ofType:@"wav"];

        if (path != nil) {
            NSURL *url = [NSURL fileURLWithPath:path];
            AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:NULL];
            [player prepareToPlay];
            [player play];
        }
    }

    else if (segments.selectedSegmentIndex == 1) {
        NSLog(@"Segment = 1");
        NSBundle *bundle = [NSBundle mainBundle];
        NSString *path2 = [bundle pathForResource:@"meowloud" ofType:@"wav"];

        if (path2 != nil) {
            NSURL *url2 = [NSURL fileURLWithPath:path2];
            AVAudioPlayer *player2 = [[AVAudioPlayer alloc]initWithContentsOfURL:url2 error:NULL];
            [player2 prepareToPlay];
            [player2 play];
//          [player2 release];
        }
    }

    text1.textColor = [UIColor clearColor];
    text2.textColor = [UIColor clearColor];
    text3.textColor = [UIColor clearColor];
    text4.textColor = [UIColor clearColor];

}

При выполнении этого кода выполняется только meow.wav независимо от того, какой сегментвыбран.

1 Ответ

3 голосов
/ 01 июля 2010

Ваш код имеет пару утечек памяти. Вы выделяете экземпляры AVAudioPlayer в своем методе play, но никогда не освобождаете эти экземпляры. См. Какао управления памятью qguidelines для подробностей. Поскольку экземпляры AVAudioPlayer должны оставаться в памяти для воспроизведения, самое простое решение - добавить переменную-член в ваш класс viewController и установить ее как свойство retain.

Ради Не повторяйте себя (СУХОЙ) я бы также предложил добавить метод, который инкапсулирует весь код, необходимый для воспроизведения одного файла wav.

Вот как бы я написал этот контроллер вида:

MyViewController.h

@interface MyViewController : UIViewController
{
    AVAudioPlayer *player;
}
@property(nonatomic, retain) AVAudioPlayer *player;
- (void)playWavFile:(NSString *)fileName;
- (IBAction)play;
@end

MyViewController.m

@synthesize player;

- (void)dealloc {
    [player release];
}

- (void)playWavFile:(NSString *)fileName {
    NSBundle *bundle = [NSBundle mainBundle];   
    NSString *path = [bundle pathForResource:fileName ofType:@"wav"];

    if (path != nil) {
        AVAudioPlayer *newPlayer;
        NSURL *url = [NSURL fileURLWithPath:path];
        newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url
                                                           error:NULL];
        [self setPlayer:newPlayer];
        [newPlayer release];

        [newPlayer prepareToPlay];
        [newPlayer play];
    }
}

- (IBAction)play {

    if (segments.selectedSegmentIndex == 0) {
        [self playWavFile:@"meow"];
    }
    else if (segments.selectedSegmentIndex == 1) {
        [self playWavFile:@"meowloud"];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...