当前位置: 代码迷 >> Iphone >> iPhone开发中使用AVAudioPlayer出现内存泄漏的解决方法
  详细解决方案

iPhone开发中使用AVAudioPlayer出现内存泄漏的解决方法

热度:89   发布时间:2016-04-25 06:07:37.0
iPhone开发中使用AVAudioPlayer出现内存泄漏的解决办法

?


最近在使用AVAudioPlayer播放音频时,发现有内存泄漏的现象,我的代码如下:

-(id)init{    if (self = [super init]) {        NSString *path = [[NSBundle mainBundle] pathForResource:@"GameOver" ofType:@"mp3"];        NSError *error = nil;        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:&error];        audioPlayer.delegate = self;        [audioPlayer prepareToPlay];        audioPlayer.numberOfLoops = -1;        [audioPlayer play];    }        return self;}
?
-(void)dealloc{    if (audioPlayer && [audioPlayer isPlaying]) {        [audioPlayer stop];    }        [audioPlayer release];    audioPlayer = nil;    [super dealloc];}
?

跟踪Instruments工具中的泄漏情况,发现都是在NSURL或NSData泄漏了,在stackoverflow发现有人这么说(帖子:http://stackoverflow.com/questions/12498015/leak-from-nsurl-and-avaudioplayer-using-arc):


Looks to be a leak in Apple's code... I tried using both

  • -[AVAudioPlayer initWithData:error:]?and
  • -[AVAudioPlayer initWithContentsOfURL:error:]

In the first case, the allocated?AVAudioPlayer?instance retains the passed in?NSData. In the second, the passed in?NSURL?is retained:

也就是说使用AVAudioPlayer播放音频时,NSData或NSURL被retain了,所以,我在dealloc方法中将其release,内存泄漏就解决了:


-(void)dealloc{    [audioPlayer.url release];        if (audioPlayer && [audioPlayer isPlaying]) {        [audioPlayer stop];    }        [audioPlayer release];    audioPlayer = nil;    [super dealloc];}
?


?

  相关解决方案