iPhone AVAudioPlayer发布EXC_BAD_ACCESS

时间:2011-04-12 12:50:35

标签: iphone objective-c

我播放声音:

NSData *data = [NSData dataWithBytesNoCopy:buffer length:length freeWhenDone:NO];
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error:nil];

在这个缓冲区中我有aac格式的声音。 一切都好,直到我想发布它,有时并不总是得到EXC_BAD_ACCESS

我以这种方式释放它:

[player release];
free (buffer);

我认为播放器stil想要对这些数据做些什么,但是在我释放(缓冲区)之后这个数据不再存在;

但是我不知道什么时候让它自由(缓冲区)。如果我删除这一行一切都好。 但是,当我删除这个免费(缓冲区)时,我将有内存泄漏:(

祝你好运 Chudziutki

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码行,

NSData *dataToEncode = [NSData dataWithBytesNoCopy:base64buffer length:sizeof(base64buffer) freeWhenDone:YES];

答案 1 :(得分:1)

(将代码放入问题时,在代码行前放置4个空格,将其格式化为代码。内联代码需要用this等小引号括起来。)

如果发生崩溃,将会有回溯。

根据症状,您显然在AVAudioPlayer完成之前释放缓冲区。在释放内存之前,您需要确保完全使用缓冲区完成音频播放器。

可能,最有效的解决方案是:

buffer = malloc(...);
.... fill buffer ....
NSData *data = [NSData dataWithBytesNoCopy:buffer length:length freeWhenDone:YES];     
AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithData:data error:nil];
... let player play ...

然后,当您想要释放缓冲区时,停止并释放播放器:

[player stop];
[player release];
player = nil; // not necessary, but prevents a dangling pointer if player is an ivar and this isn't -dealloc

也就是说,让音频播放器取得内存的所有权,并在完成后自由()使用它。