我注意到我的AVAssetReader(阅读器在这种情况下)retainCount继续与此代码上升。我相信我正在释放我应该做的一切。有没有办法检查CMSampleBufferRef参考计数?有没有人看到我忘记发布的东西?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确实下降到1的保留计数
我感动读者的释放测试在此之前该池释放...
[pool release];
NSLog(@"Reader Count: %d", reader.retainCount);
[reader release];
,我得到的1
但是仍然记忆出现retainCount的预期结果从CMSampleBufferRefs泄漏因为FigSampleBuffer正呆在附近。以下是我在仪器发现:
和调用堆栈导致CMSampleBufferRef ...
这是我已经退出循环之后,清理了一切,然后将其重新创建为另一个AVAsset。正如我重复这个更多FigSampleBuffer出现在每个爆头。
请注意,retainCount永远无法返回n 0;一个释放的对象,碰巧仍然有点可行,有时会返回1. – bbum