gpt4 book ai didi

iphone - CMSampleBufferRef 上的 CFRelease - 为什么我需要调用它?

转载 作者:可可西里 更新时间:2023-11-01 17:08:33 24 4
gpt4 key购买 nike

CMSampleBufferRef sampleBuffer = [assetOutput copyNextSampleBuffer];
CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sampleBuffer);
CMBlockBufferAppendBufferReference(_sem == 0 ? _buffer0 : _buffer1, buffer, 0, 0, 0);
//if(sampleBuffer)
// CFRelease(sampleBuffer);

为什么这会在第一行导致内存泄漏(至少 Leaks 是这么建议的)?我有我的 assetOutput.shouldAlwaysCopySampleOutput = NO。这是我对情况的理解:

CMSampleBufferRef sampleBuffer = [assetOutput copyNextSampleBuffer];

此行将创建对 assetOutput 中的示例缓冲区的引用

CMBlockBufferRef buffer = CMSampleBufferGetDataBuffer(sampleBuffer);

此行将从 CMSampleBuffer 获取 CMBlockBuffer 但不会分配新缓冲区,在这种情况下的 Get 方法意味着它是一个临时(自动释放)缓冲区

CMBlockBufferAppendBufferReference(_sem == 0 ? _buffer0 : _buffer1, buffer, 0, 0, 0);

此行会将上面创建的 CMBlockBuffer 的引用附加到选定的全局范围缓冲区。它不会复制任何内存块。

因此,在这三行中,我没有分配任何内存,也没有复制任何内存,它们都是引用。我不明白泄漏是从哪里来的。我尝试添加注释掉的行,但它似乎仍然泄漏(尽管次数减少了)

最佳答案

alwaysCopiesSampleData 与内存管理无关。这仅与您是在原始样本缓冲区还是原始样本的克隆上涂鸦有关。它的名字有点遗憾。

copyNextSampleBuffer 遵循创建规则,因此,在您使用完后应该将其释放。它创建一个保留计数至少为 1 的引用。

创建规则:

https://developer.apple.com/library/ios/DOCUMENTATION/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029

Apple 的文档链接往往会更改,但如果上面的链接失效,只需谷歌“The Create Rule”

关于iphone - CMSampleBufferRef 上的 CFRelease - 为什么我需要调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18473094/

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