首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CMSampleBufferRef不释放内部内存

CMSampleBufferRef不释放内部内存
EN

Stack Overflow用户
提问于 2011-08-25 16:50:22
回答 1查看 1.5K关注 0票数 2

我注意到,我的AVAssetReader(本例中的读取器) retainCount继续与此代码一起上升。我相信我正在适当地释放我应该做的一切。有没有一种检查CMSampleBufferRef引用计数的方法?有人看到我忘记释放的东西了吗?

代码语言:javascript
运行
复制
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的关键公园

代码语言:javascript
运行
复制
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的retainCount

我在读取器发布之前把池版本移到了测试中.

代码语言:javascript
运行
复制
[pool release];
NSLog(@"Reader Count: %d", reader.retainCount);
[reader release];

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

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

以及通向CMSampleBufferRef的呼叫堆栈..。

这是在我退出循环、清理所有内容、然后为另一个AVAsset重新创建它之后。正如我重复的那样,菲格-桑普·巴弗的照片出现在每一张头像中。

EN

回答 1

Stack Overflow用户

发布于 2011-08-25 17:59:56

不要打电话给retainCount,这是没用的。

这段代码没有什么明显的问题,内存管理是明智的。

真正的问题是:你是否平衡了所有的版本?如果是的话,你就完了。

如果您看到了无限内存的增长,那么请提交一个bug。

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

唯一能够绝对了解retainCount的情况是:

您实现了一个新的根类( coincidence)

  • you子类工作,但只有不自动释放实例-
  • -您不将对象传递给任何系统API

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7194207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档