Я замечаю, что 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:
и стек вызовов, ведущий к CMSampleBufferRef ...
Thisбыло после того, как я вышел из цикла, очистил все, а затем воссоздал его для другого AVAsset.Как я повторяю это больше FigSampleBuffer появляется в каждом выстрел в голову.