Objective-c: как освободить память для AvAudioPlayer - PullRequest
2 голосов
/ 21 мая 2011

У меня есть звуковой файл, который я использую в своей программе:

NSString *soundPath1 = [[NSBundle mainBundle] pathForResource:@"mysound" ofType:@"mp3"];
NSURL *soundFile1 = [[NSURL alloc] initFileURLWithPath:soundPath1];   
soundFilePlayer1 = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFile1 error:nil];
[soundFilePlayer1 prepareToPlay];   

Итак, soundFilePlayer1 определен в моем файле .h, потому что мне нужно, чтобы он был глобальным.

Теперь ... мне нужно выпустить soundFilePlayer1 и soundFile1? (и soundPath1?)

Если это так ... где я могу это сделать? Я думаю, что мне нужно выпустить soundFilePlayer1 в: (но нужно ли сначала остановить его, так как он может воспроизводиться при выходе из программы?)

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

как насчет других файлов ... где я могу их выпустить? Спасибо

1 Ответ

1 голос
/ 21 мая 2011

Запомните простое эмпирическое правило. Отпустите только если вы вызвали alloc, init или new на объекте. Итак, вы захотите выпустить soundFile1. Кроме того, вы можете использовать удобный метод и автоматически добавлять звуковой файл в пул автоматического выпуска:

NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"mp3"];
NSURL *file = [NSURL fileURLWithPath:path]; //autoreleased
player = [[AVAudioPlayer alloc] initWithContentsOfURL:file error:nil];

if([player prepareToPlay]){
    [player play];
}  

И да, вы можете выпустить player (soundFilePlayer1) в dealloc, но если вы не зацикливаете аудиофайл, есть лучший способ. Соответствует AVAudioPlayerDelegate:

@interface YourView : UIViewController <AVAudioPlayerDelegate> { //example

Затем реализуйте метод здесь:

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag {
    //your audio file is done, you can release safely
    [player release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...