由于 Metal Language 也是基于 C++11,而 C++ 似乎是一种经过验证的性能语言的完美契合,我希望完全绕过 Objective-C / Swift。我很想留在 C++ 领域。有没有可能?
原文由 Bilal Ahsan 发布,翻译遵循 CC BY-SA 4.0 许可协议
由于 Metal Language 也是基于 C++11,而 C++ 似乎是一种经过验证的性能语言的完美契合,我希望完全绕过 Objective-C / Swift。我很想留在 C++ 领域。有没有可能?
原文由 Bilal Ahsan 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答1.3k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
4 回答832 阅读
1 回答905 阅读
1 回答940 阅读
1 回答707 阅读
1 回答871 阅读
从技术上讲是的,但它会非常难看,并且可能会破坏其他一些 Objective-C 部分。
Objective-C 和 C++ 一样,是作为预处理器开始的。其中一个遗留问题是每个 Objective-C 方法也公开为一个 C 函数调用,该函数调用分别将对象实例和方法选择器作为前两个参数,然后以从左到右的顺序声明其他参数。
NSObject
和构成 Objective-C 运行时的 C 调用都可以查找将被任何方法调用调用的 当前 C 函数。因此,您可以创建一个 C++ 类来获取所有 C 函数指针(它甚至可以从 C 运行时执行此操作,使其成为纯 C++ 代码而不是 Objective-C++)并直接跳转到类似的适当代码。
缺点是:Objective-C 通常使用动态分派(即在每次调用时将方法解析为 C 函数),而像键值观察这样的机制之所以起作用,是因为它使用了动态分派。如果您在其他人开始观察之前获取 C 函数指针,那么您的调用将在不通知观察者的情况下更新属性。所以你可能会破坏一些模块。
发出该警告,并假设您可以将 C++ 桥接类构建为 Objective-C++ 以获得更简单的语法,例如
…我很方便地拒绝将
+instanceMethodForSelector:
的结果转换为适当的类型,因为我相信我会弄错。我倾向于退缩并在我的实际代码中引入中间typedef
但您可能更喜欢更简洁。