我试图弄清楚所有权如何与功能CVMetalTextureGetTexture一起工作:

CVMetalTextureRef textureRef;
// ... textureRef is created
id<MTLTexture> texture = CVMetalTextureGetTexture(_textureRef);
CVBufferRelease(textureRef); // Releasing the existing texture
// Is texture still valid here?

释放texturetextureRef仍然有效吗?如果没有,我可以以某种方式将所有权从textureRef转移到texture(ARC),这样我就不必在CVBufferRelease发布后再调用texture吗?

swift 回答同样的问题:
var texture: MTLTexture
do {
  var textureRef: CVMetalTexture
  // ... textureRef is created
  texture = CVMetalTextureGetTexture(textureRef)!
  // end of scope, textureRef is released
}
// Is texture still valid here?

最佳答案

这是一个很好的问题,因为这种方法破坏了Create Rule,但似乎此方法确实保留了基础对象。我猜这条规则不适用于Core Foundation-> ARC方法...
您可以在this Apple Demo中看到,他们在将ref转换为id<MTLTexture>后确实释放了该ref。他们在更隐式的Swifty版本中执行此操作,因此很容易错过它。

10-07 21:24