【问题标题】:id<> required for MTLDevice classMTLDevice 类需要 id<>
【发布时间】:2018-08-15 07:06:44
【问题描述】:

我对 Objective-c 很陌生,所以请耐心等待,我仍在尝试理解可以在 Objective-c 中放置属性和类变量的众多位置。

我是一位经验丰富的 Metal 开发人员,但我几乎没有使用过 Objective-c。

我正在尝试创建一个 MetalCore 类来保存 MTLDevice、MTLCommandQueue 并促进应用程序核心管道等的创建。

因此我定义了以下内容

@property (readonly, nonatomic, assign) MTLDevice* devicePtr;

然而,在我的课堂上我得到了错误Unknown type name MTLDevice; did you mean...,即使我是#import &lt;Metal/Metal.h&gt;,那么这里发生了什么?

我查看了堆栈溢出,发现人们定义这样的函数的示例

- (<MTLDevice> *)device;

- (instancetype)initWithDevice:(id<MTLDevice>) device;

整个 id 和 是怎么回事?什么情况下可以省略id部分?

我发现特别奇怪的是,虽然大多数 Metal 类型似乎都需要 id,但有些像 MTLRenderPipelineDescriptor 这样不需要它,实际上只在 Type* 模式下工作。为什么会这样?如何从文档中确定需要什么?

【问题讨论】:

  • id 是动态类型,使用 可以明确定义它是什么类型的输入。尝试使用 #import #import

标签: ios objective-c metal


【解决方案1】:

在 Objective-C 中,id 基本上表示“任何对象类型”。如果要确保对象符合协议(例如MTLDevice),则在声明其类型时在id 之后的尖括号中指定协议:id&lt;MTLDevice&gt; 表示“符合MTLDevice 的类型协议”。

与具体类(例如MTLRenderPipelineDescriptor)不同,您不会在id 之后使用*,因此您不会写id&lt;MTLDevice&gt; *(除非您使用指向设备的指针,这并不常见)。 MTLDevice * 没有意义,因为 MTLDevice 不是具体类型。 &lt;MTLDevice&gt; 本身就是废话,是语法错误,&lt;MTLDevice&gt; * 也是如此。

来自 Swift,您可能习惯于将协议和具体类型混为一谈,因为 Swift 不会在“符合协议的某些类型”和“某些具体类型”之间进行语法区分。要判断某个东西是否是协议,请查阅文档;当某物是协议时,它会明确指出。在 Metal 中,所有“描述符”类型都是具体的(例如,MTLRenderPipelineDescriptor),而大多数其他对象类型都是在协议后面抽象的(MTLDeviceMTLCommandQueueMTLLibraryMTLFunctionMTLTexture、@987654339 @、MTLCommandBuffer 等)

【讨论】:

    【解决方案2】:

    如果你知道 java,id&lt;MTLDevice&gt; 就像一个继承了名为“MTLDevice”的接口的对象。

    主要是因为不同的 iPhone 有不同的 GPU 架构。为了获得最大效率,不同的 GPU 有不同的金属实现。

    如在 iPhoneX 中真正的 MTLDevice 是一个名为 'AGXA11Device' 的类,而在 iPhone 6 plus 中是 'AGXA9Device'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2019-03-03
      相关资源
      最近更新 更多