2014-09-27 3 views
0

Я читаю аудиофайл в ОЗУ, используя следующий метод, передавая объект MPMediaItem. Тем не менее, каждый раз, когда это вызывается, начало функции должно освобождать память, используемую для предыдущего аудиофайла, а это не так, т.е. Xcode показывает, что использование памяти продолжает увеличиваться при каждом вызове функции и, в конечном итоге, в ОС заканчивается память.Как освободить память, используемую AudioFileReadPacketData - Xcode показывает, что память все еще используется

Я делаю что-то явно неправильно?

Примечание: ниже функция является единственным местом, я использую мой аудиоданные Ивар

Memory allocation summary in Instruments

The same audio file cached in memory by below function

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..."); 

} 

EDIT: Я использовал ту же самую структуру кода и читать данные звукового файла используя вместо этого функцию ExtAudioFileRead, и память освобождается и перераспределяется как предположительно. Это может быть связано с тем, как я использую функцию AudioFileReadPacketData =/

+0

Если вы запустите инструмент памяти в инструментах, вы сможете лучше понять, какой бит памяти висит. –

+0

Я вижу, что аудиофайлы читаются в ОЗУ и помещаются в мой аудиодатчик ivar и которые я не могу освободить ... – believesInSanta

+0

Я не понимаю, почему все эти файлы накапливаются - они должны быть освобождены, когда я звоню бесплатно (audioData) ? Зачем...? – believesInSanta

ответ

0

Перед освобождением ресурсов AudioFileID необходимо позвонить AudioFileClose.

В противном случае AudioFile сохраняет ссылку на указатель аудиоданных аудиоданных, и память не может быть освобождена.

if (audioData != NULL) { 
    NSLog(@"audio data pointer not empty"); 
    AudioFileClose(audioFileID); // <- missing call 
    free (audioData); 
} 
+0

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – skuntsel

+0

Я не понимаю, что вы говорите, @skuntsel. Извините, английский не мой родной язык. Можете ли вы сделать это просто? – liaogang

+0

Я отредактировал его ответ для ясности. Все хорошо. – believesInSanta

Смежные вопросы