AVAudioPlayer не освобождает память

Я инициализирую переменную ivar AVAudioPlayer, играю и пытаюсь освободить ее память. После строки выпуска он не устанавливается в 0x0. После нулевой строки он не меняется на 0x0. Требуется ли AVAudioPlayer что-то особенное для освобождения памяти?

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource: @"mysound" ofType: @"aif" inDirectory:@"/"]] error: &err];
audioPlayer.numberOfLoops = 0;
audioPlayer.volume = .5;
[audioPlayer prepareToPlay];
[audioPlayer play];
[audioPlayer release];
audioPlayer = nil;

person 4thSpace    schedule 08.01.2010    source источник


Ответы (2)


Что ж,

AVAudioPLayer воспроизводит аудиофайлы асинхронно. Не следует отпускать проигрыватель после начала воспроизведения, это может привести к ошибке, связанной с памятью, и ваш аудиофайл также может не воспроизводиться.

Вы должны выпустить плеер через avaudioplayerdelegate. Для получения дополнительной информации вы также можете проверить этот ответ.

Надеюсь это поможет.

Спасибо,

Madhup

person Madhup Singh Yadav    schedule 08.01.2010
comment
Я замечаю, что даже при отпускании и установке значения nil в методе делегата audioPlayerDidFinishPlaying он не устанавливается в 0x0. - person 4thSpace; 08.01.2010

 - (IBAction) playaction {

        NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"songname" ofType:@"mp3"];
        NSURL *newURL = [[NSURL alloc] initFileURLWithPath: soundFilePath];
        self.soundFileURL = newURL;
        [newURL release];
        [[AVAudioSession sharedInstance] setDelegate: self];
        [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil];

    // Registers the audio route change listener callback function
    AudioSessionAddPropertyListener (
                                     kAudioSessionProperty_AudioRouteChange,
                                     audioRouteChangeListenerCallback,
                                     self
                                     );

    // Activates the audio session.

    NSError *activationError = nil;
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError];

    AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: soundFileURL error: nil];
    self.appSoundPlayer = newPlayer;
    [newPlayer release];
    [appSoundPlayer prepareToPlay];
    [appSoundPlayer setVolume: 1.0];
    [appSoundPlayer setDelegate: self];
    [appSoundPlayer play];

}

Здесь appSoundPlayer объявлен в файле заголовка как

AVAudioPlayer *appSoundPlayer;

Это свойство объявлено и синтезировано, также выпущено в методе dealloc как

[appSoundPlayer release];
person Nithin    schedule 08.01.2010
comment
Спасибо. Как воспроизвести звуки подряд? У меня есть одна за другой настройка с помощью метода, аналогичного тому, что вы делаете выше. Однако играет только второй. - person 4thSpace; 08.01.2010
comment
как вы это реализуете ??? Лучше всего использовать метод - (void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player успешно: (BOOL) flag {if (flag) {// ваш метод для следующего воспроизведения. }} - person Nithin; 08.01.2010
comment
Эээ, чувак, разве ты не имел в виду [self.appSoundPlayer release];? Если вы объявите его как @property (nonatomic, retain) AVAudioPlayer *appSoundPlayer;, вам определенно необходимо получить к нему доступ, используя синтаксис с точкой (self.appSoundPlayer) - person Nate Symer; 11.12.2012