CMSampleBufferRef не освобождает внутреннюю память - PullRequest
2 голосов
/ 25 августа 2011

Я замечаю, что retainCount моего AVAssetReader (в данном случае читатель) продолжает расти с этим кодом.Я верю, что правильно выпускаю все, что должен.Есть ли способ проверить количество ссылок CMSampleBufferRef?Кто-нибудь видит что-то, что я забыл выпустить?

AVAssetReaderTrackOutput* trackOutput = (AVAssetReaderTrackOutput*)[reader.outputs objectAtIndex:0];
NSLog(@"PreReader Count: %d", reader.retainCount);
CMSampleBufferRef sampleBufferRef = [trackOutput copyNextSampleBuffer];
NSLog(@"Reader Count: %d", reader.retainCount);  //retainCount has increased by 1
if (sampleBufferRef) {

    CopySampleBufferToStream(sampleBufferRef, stream);

    CMSampleBufferInvalidate(sampleBufferRef);
    CFRelease(sampleBufferRef); //Retain count doesn't go back down, item hasn't been deleted?
}

С этим как ключевые парки CopySampleBufferToStream

void CopySampleBufferToStream(CMSampleBufferRef sampleBufferRef, cSoundStream* stream)
{
    CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef);
    size_t length = CMBlockBufferGetDataLength(blockBufferRef);

    do 
    {
        //...

        OSStatus result = CMBlockBufferCopyDataBytes(blockBufferRef, startOffset, copyLength, (stream->mSrcBuffers[stream->mActiveWriteIdx].mData + stream->mSrcBuffers[stream->mActiveWriteIdx].mBufferOffset));

        //...

    } while(stream->ContinueLoading() && stream->TransitionNotReady() && copyLength < length);

}

Редактировать:

Таким образом, после дальнейшей отладки я смог подтвердить, что после выхода из цикла и очистки пула автоматического выпуска AVAssetReader возвращается к значению retainCount, равному 1

Я переместил выпуск пула перед выпуском программы чтения, чтобы проверить это....

[pool release];
NSLog(@"Reader Count: %d", reader.retainCount);
[reader release];

и я получил ожидаемый результат retainCount, равный 1.

Однако, похоже, что из-за утечки памяти из CMSampleBufferRefs все еще остается FigSampleBuffer.Вот что я нашел в Instruments:

enter image description here

и стек вызовов, ведущий к CMSampleBufferRef ...

enter image description here

Thisбыло после того, как я вышел из цикла, очистил все, а затем воссоздал его для другого AVAsset.Как я повторяю это больше FigSampleBuffer появляется в каждом выстрел в голову.

1 Ответ

1 голос
/ 25 августа 2011

Не звоните retainCount; это бесполезно.

В этом коде нет ничего явно плохого в управлении памятью.

Настоящий вопрос таков; Вы сбалансировали все удержания с релизами? Если это так, вы сделали.

Если у вас есть и вы видите неограниченный рост памяти, то сообщите об ошибке.

<Ч />

Абсолютный retainCount в любой момент времени является подробностью реализации, и это значение, вероятно, будет отражать внутренние подробности реализации вне вашего контроля. Кроме того, retainCount никогда не отражает, находится ли объект в настоящее время в пуле автоматического выпуска.

Единственный раз, когда retainCount может быть абсолютно известен:

  • вы реализуете новый корневой класс (подклассы NSObject работают, но только по совпадению)
  • у вас нет авто-релизов когда-либо
  • вы не передаете объект в любой системный API
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...