【问题标题】:Calling an Objective-C class method from C++从 C++ 调用 Objective-C 类方法
【发布时间】:2012-02-09 17:28:52
【问题描述】:

我在从 C++ 文件调用 Objective-C 类方法时遇到了一些问题。示例:

在我的 .h 中:

@interface MyClass : NSObject {
}
+ (void)myMethod:(NSString *)str;

在我的 .m 中:

+ (void) myMethod:(NSString *)str { ... }

在我的 .cpp 中:

??

由于没有类实例,如何调用 myMethod?它本质上是一个静态的?

谢谢

【问题讨论】:

标签: c++ objective-c


【解决方案1】:

C++ 中的对象与 Objective-C 中的对象不兼容。您不能简单地从 C++ 调用 Objective-C 方法。

但是有一些解决方案:

  1. 使用 Objective-C++。将您的.cpp 重命名为.mm,然后您可以在您的C++ 代码中使用Objective-C 语法:[FlurryAnalytics myMethod: @"foo"];

  2. 使用对 Objective-C 运行时系统的直接调用。我不会告诉你怎么做,因为我真的认为你不应该这样做,事实上你不想这样做。

  3. 编写一个纯 C 接口。也就是说,在某个 .m 文件中,定义 void myFunction(const char *str) { ... } 并从 C++ 中调用它。你可以找到这个here的例子。

【讨论】:

  • 我认为在 C++ 端生成一些全局数据并使用 Objective-c 访问它将是最可行的选择。
【解决方案2】:

您将需要 .mm 来调用 Objective-C 方法,而不是 .cpp。除此之外,您对“它本质上是静态的”的评论是准确的,因为您可以使用与在 C++ 中调用静态类函数的方式类似的逻辑来调用它:

[MyClass myMethod:@"Some String"];

尽管由于许多不影响此答案的原因,该方法在 C++ 意义上不是静态的 - 它在编译时没有解析,并且确实在类(MyClass 元类)中运行。

【讨论】:

  • 如果我没有将所有 .cpp 文件转换为 .mm 的选项,我有哪些选项?我试图保持跨平台能力,所以我不能去改变文件类型。
  • .cpp 文件可以调用任何旧的 C++ 并且 .mm 文件包含 C++ 和 Objective-C,因此一个特定于平台的薄层是一种选择;或者在 Xcode 中使用工具栏上“查看”一词上方的按钮打开右侧面板,转到“身份和类型”并将文件类型设置为 Objective-C++。这应该会导致相关标志被发送到编译器,以便不遵循按文件名类型的默认行为。
  • @Asheh:您可以在 Xcode 中覆盖文件类型。单击项目导航器中的 .cpp 文件,文件检查器将显示一个名为“文件类型”的下拉列表。将其从 Default 更改为 Objective-C++ 源,然后您的 cpp 文件可以包含 Objective C 语法,就好像它是一个 .mm
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多