CMSampleBufferRef不释放内部存储器

时间:2011-08-25 16:50:22

标签: iphone objective-c audio

我注意到我的AVAssetReader(本例中的阅读器)retainCount继续使用此代码上升。我相信我正在释放我应该做的一切。有没有办法检查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);

}

修改

因此,在进一步调试之后,我能够确认在循环退出并且Autorelease池被清除后,AVAssetReader确实降到了keepCount为1

我在读者发布之前移动了池版本来测试这个......

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

我得到了retainCount为1的预期结果。

然而,由于FigSampleBuffer的存在,内存仍然似乎从CMSampleBufferRefs泄漏。以下是我在仪器中发现的内容:

enter image description here

和调用堆栈通向CMSampleBufferRef ...

enter image description here

这是在我退出循环后,清理所有内容,然后重新创建另一个AVAsset。当我重复这个时,更多的FigSampleBuffer出现在每个爆头中。

1 个答案:

答案 0 :(得分:1)

不要致电retainCount;它没用。

该代码没有任何明显的错误,明智的内存管理。

真正的问题是;您是否将所有保留与发布保持平衡?如果是这样,你就完成了。

如果你有并且你看到无限的内存增长,那么就提交一个bug。


任何给定时间的绝对retainCount都是一个实现细节,该值很可能反映出您无法控制的内部实现细节。此外,retainCount从不反映对象当前是否在自动释放池中。

唯一可以绝对知道retainCount的时间是:

  • 你实现了一个新的根类(NSObject子类工作,但只是巧合)
  • 您不会自动释放实例
  • 您没有将对象传递给任何系统API