В блоге в ответе Джхалии описана утечка, характерная для ситуации, когда ваш плеер не может запустить аудио, например, когда он не может найти файл.
Реальная проблема с вашим кодом состоит в том, что вы отпускаете проигрыватель только в том случае, если пользователь явно останавливает звук.Если звук воспроизводится до конца, у вас есть экземпляр проигрывателя с retainCount, равным 1. Затем, если пользователь нажимает кнопку воспроизведения снова, вы создаете нового проигрывателя и назначаете его переменной player
, пропуская старую.
Самое простое решение для этого - сделать player
сохраненным свойством:
@property(nonatomic,retain)AVAudioPlayer *player;
Затем, вместо того, чтобы назначать ивару напрямую, используйте мутатор для установки игрока, который неявно освободитранее установленный экземпляр, если он есть:
[self setPlayer:[[[AVAudioPlayer alloc] initWithContentsOfURL:file error:&err] autorelease];
И не забудьте освободить его в свой сделке:
-(void)dealloc {
[player release];
[super dealloc];
}