我正在通過傳遞MPMediaItem對象使用以下方法將音頻文件讀入RAM中。但是,每次調用這個函數時,函數的開始都會釋放用於前一個音頻文件的內存,而不是這樣,即Xcode顯示每次調用該函數時內存使用量都會持續增加,最終會導致OS內存耗盡。如何釋放AudioFileReadPacketData使用的內存 - Xcode顯示仍在使用的內存
我在做什麼明顯錯誤?
注:以下功能是我使用我的audioData伊娃
void *audioData;
- (void)playItem:(MPMediaItem *)mediaItem
{
if (audioData != NULL) {
NSLog(@"audio data pointer not empty");
free (audioData);
}
// open audio file
AudioFileID audioFileID;
NSURL *mediaItemURL = [mediaItem valueForProperty:MPMediaItemPropertyAssetURL];
OSErr err;
err = AudioFileOpenURL((__bridge CFURLRef)mediaItemURL,
kAudioFileReadPermission,
0,
&audioFileID);
NSAssert(err == noErr, @"Couldn't open audio file...");
// read audio file properties and malloc audioData property
UInt32 audioDataPacketCount;
UInt32 audioDataPacketCountSize = sizeof(audioDataPacketCount);
err = AudioFileGetProperty(audioFileID,
kAudioFilePropertyAudioDataPacketCount,
&audioDataPacketCountSize,
&audioDataPacketCount);
NSAssert(err == noErr, @"Couldn't read audio file properties...");
UInt32 audioDataByteCount;
UInt32 audioDataByteCountSize = sizeof(audioDataByteCount);
err = AudioFileGetProperty(audioFileID,
kAudioFilePropertyAudioDataByteCount,
&audioDataByteCountSize,
&audioDataByteCount);
NSAssert(err == noErr, @"Couldn't read audio file properties...");
audioData = malloc(audioDataByteCount);
// read audio file packets
err = AudioFileReadPacketData(audioFileID,
false,
&audioDataByteCount,
NULL,
0,
&audioDataPacketCount,
audioData);
NSAssert(err == noErr, @"Couldn't read audio file to memory...");
}
編輯的唯一的地方:我用同樣的代碼結構和讀取音頻文件數據使用ExtAudioFileRead函數取而代之的是內存釋放並重新分配。這可能與我如何使用AudioFileReadPacketData功能有關=/
如果你在儀器中運行內存工具,那麼你應該能夠更好地瞭解哪一點內存在懸掛。 – 2014-09-27 16:35:07
我看到音頻文件讀取到RAM並放入到我的audioData伊娃,我不能免費... – believesInSanta 2014-09-27 16:37:53
我不明白爲什麼所有這些文件都積累 - 他們應該釋放時,我打電話免費(audioData) ?爲什麼...? – believesInSanta 2014-09-27 16:48:10