В вашем коде есть несколько ошибок.
Например, в вашем dealloc
:
[audioPlayer release];
self.audioPlayer.delegate = nil;
self.audioPlayer = nil;
Вы выпускаете audioPlayer, затем на выпущенном (и, возможно, освобожденный) игрок, для которого вы устанавливаете делегат равным nil, а затем свойству, которое освобождает его снова.Удалите [audioPlayer release];
.
В вашем audioPlayerDidFinishPlaying:successfully:
вы также освобождаете игрока, но вы не установили переменную на nil
.Это может вызвать сбой, так как к тому времени, когда вы снова получите доступ к этой переменной, другой адрес может быть по этому адресу памяти.Вместо этого используйте это свойство и сделайте это, как в dealloc
:
self.audioPlayer.delegate = nil;
self.audioPlayer = nil;
Затем, в playSound::
(argh, безымянный второй аргумент!) Вы перепроизводите fileURL
.-[NSURL fileURLWithPath:isDirectory:]
возвращает автоматически выпущенный объект, вы не можете его освободить.
Последнее, но, возможно, не в последнюю очередь, вы пропускаете sndFileToPlay
, вам нужно выпустить его в вашем методе dealloc
.И вместо sndFileToPlay = [[NSString alloc] initWithString:sndFileName];
просто сделайте sndFileToPlay = [sndFileName copy];
.
Возможно, вы захотите прочитать об управлении памятью Objective-C.Это не сложно, если вы знаете три или четыре эмпирических правила.