gpt4 book ai didi

iphone - CMSampleBufferRef 不释放内部内存

转载 作者:行者123 更新时间:2023-12-03 21:18:41 27 4
gpt4 key购买 nike

我注意到我的 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);

}
<小时/>

编辑:

因此,经过进一步调试,我能够确认,在循环退出且自动释放池被清除后,AVAssetReader 的保留计数确实降至 1

我将池版本移到了阅读器版本之前以测试此...

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

我得到了保留计数为 1 的预期结果。

但是,由于 FigSampleBuffer 仍然存在,内存似乎仍然从 CMSampleBufferRefs 泄漏。这是我在 Instruments 中找到的内容:

enter image description here

以及通向 CMSampleBufferRef 的调用堆栈...

enter image description here

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

最佳答案

不要调用retainCount;这是没用的。

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

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

如果您发现内存无限增长,请提交错误。

<小时/>

任何给定时间的绝对保留计数都是一个实现细节,该值可能反射(reflect)超出您控制范围的内部实现细节。此外,retainCount 从不反射(reflect)对象当前是否位于自动释放池中。

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

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

关于iphone - CMSampleBufferRef 不释放内部内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7194207/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com