我试图弄清楚所有权如何与函数CVMetalTextureGetTexture
一起工作:
CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture
// Is texture still valid here?
发布textureRef
后texture
仍然有效吗?如果没有,我是否可以以某种方式将所有权从textureRef
转移到texture
(ARC),这样我就不必稍后在发布texture
时致电CVBufferRelease
?
斯威夫特的相同问题:
var texture: MTLTexture
do {
var textureRef: CVMetalTexture
// ... textureRef is created
texture = CVMetalTextureGetTexture(textureRef)!
// end of scope, textureRef is released
}
// Is texture still valid here?
这是一个很好的问题,因为这种方式会破坏创建规则,但似乎此方法确实保留了基础对象。我想这条规则不适用于核心基础 -> ARC 方法......
您可以在此Apple演示中看到,他们在将其转换为id<MTLTexture>
后确实发布了引用。他们在更隐含的 Swifty 版本中这样做,所以很容易错过。
在我看到你的问题之前,我们还做了另一个实验:
in a loop, CVMetalTextureRef created from CVPixelBuffer comes from Camera.
static void *texturePtr;
/** AVCaptureVideoDataOutputSampleBufferDelegate, as a loop */
{
CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture
texturePtr= (__bridge_retained void*)texture;
// no releasing the texturePtr
// (__bridge_transfer id<MTLTexture>)texturePtr;
}
我发现我没有release
texturePtr
,但仍然no memory leak
发生。更重要的是,在我们用新的 var 替换它之前,texturePtr
会在某个时候valid
。
所以我认为这可能与您的问题有关。
我的回答更像是一个论点,而不是一个答案。