如何将`id<MTLCommandQueue>`转换为Metal-Cpp的`MTL::CommandQueue`?

问题描述 投票:0回答:1

情况:我正在使用Objective-C开发一个iOS Metal应用程序。我需要使用第 3 方库 VkFFT,它提供基于 Metal-Cpp 的金属 FFT。

我需要什么:

id<MTLCommandQueue>
实例作为
MTL::CommandQueue
对象从 Objective-C 世界传递到 C++ 世界,以便我可以将计算命令推送给它。 我不想在 Metal-Cpp 中创建单独的命令队列,因为使用单个命令队列可以让我继续将所有命令推送到它,而无需
waitUntilCompleted

c++ ios objective-c metal
1个回答
0
投票

桥接演员

桥接转换是用以下三个关键字之一注释的 C 风格转换:

  • (__bridge T) op 将操作数转换为目标类型 T。如果 T 是 可保留的对象指针类型,则op必须具有不可保留的 指针类型。如果 T 是不可保留的指针类型,则 op 必须具有 可保留的对象指针类型。否则演员阵容就不健全。 没有所有权转移,ARC插入没有retain 操作。
  • (__bridge_retained T) op 强制转换操作数,该操作数必须 具有可保留的对象指针类型,指向目标类型,其中 必须是不可保留的指针类型。 ARC 保留值、主题 对本地值进行通常的优化,接收者是 负责平衡+1。
  • (__bridge_transfer T) op 强制转换 操作数,必须具有不可保留的指针类型,指向 目标类型,必须是可保留的对象指针类型。弧 将释放封闭完整表达式末尾的值, 受本地值的通常优化影响。这些演员阵容是 需要将对象移入和移出 ARC 控制;看 可保留对象转换部分的基本原理 指点一下。

纯粹使用 __bridge_retained 或 __bridge_transfer 强制转换来说服 ARC > 分别发出不平衡的保留或释放,是很糟糕的形式。

id<MTLCommandQueue> objcQueue = /* Your Objective-c queue */;
MTL::CommandQueue* queue = (__bridge MTL::CommandQueue*)objcQueue;
© www.soinside.com 2019 - 2024. All rights reserved.