我播放声音:
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
答案 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
也就是说,让音频播放器取得内存的所有权,并在完成后自由()使用它。