【问题标题】:Objective C++: Call Objective C method from C++Objective C++:从 C++ 调用 Objective C 方法
【发布时间】:2023-03-29 20:13:02
【问题描述】:

我正在使用 NSURLSession 连接到数据库。
我已经在 Windows 的 C++ 中实现了这个功能,并试图让它在 iOS 上也能工作。
我有一个从基础派生的 .h 文件C++ 类是我的 .mm 文件的头文件。
如果我是正确的,我必须在 C++ 中实现我的 .h 文件中的所有函数。
但是 NSURLSession 是一个 Objective-C 函数。

如何从我的 C++ 函数调用 Objective-C 方法?

我有一个名为 Connect() 的 C++ 函数,我在其中创建了一个具有 alloc 和 init 的 C++ 对象 m_Delegate。

this->m_Delegate = [[PrivateNSURLSessionDelegate alloc] initWihParent:this];
//where PrivateNSURLSessionDelegate is the name of my interface.

该接口具有我试图从中调用的 -(bool)NSConnect(在@implementation 中实现):

void Connect()
{
    [PrivateNSURLSessionDelegate NSConnect];
    //This however gives me the error: +[PrivateNSRLSessionDelegate NSConnect]: unrecongnized selector sent to class
}

我也尝试过使用我的 C++ 对象

void Connect()
{
    [m_Delegate NSConnect];
    //This gives me a error that is unrecognized selector sent to instance
}

有没有更好的方法来做到这一点?我基本上想要求 Objective-C 完成所有 NSURL 的工作,然后只将数据发送回 C++。

我对 Objective-C 完全陌生,因此我们将不胜感激任何和所有帮助!谢谢!

【问题讨论】:

  • 愚蠢的问题,但您确定将您的 Objective-C++ 类的扩展名设置为 .mm
  • 我检查了三次。哈哈。它是一个 .mm :)。

标签: ios objective-c nsurlsession nsurl objective-c++


【解决方案1】:

Objective-C 是 C 的超集,Objective-C++ 是 C++ 的超集。 Objective-C++ 源代码文件有一个 .mm 后缀,而 Objective-C 有一个 .m 后缀。

你不能从 C++ 调用 Objective-C。但是,您可以从 Objective-C++ 调用 Objective-C,也可以在 Objective-C++ 中编写常用的 C++ 类。

【讨论】:

  • 好的,酷!感谢您的澄清。我想我正在尝试从 Objective-C++ 调用一个 Objective-C 方法。
  • Objective-C++ 不是 C++ 的超集。 Objective-C++ 允许您将 C++ 与 Objective-C 代码混合使用,否则它们是完全分开的。例如,您不能从 Objective-C 中的 C++ 继承,反之亦然。
【解决方案2】:
-(bool)NSConnect

这里的- 表示它是一个实例方法。相反,+ 表示一个类方法。

话虽如此,[PrivateNSURLSessionDelegate NSConnect]; 调用一个类方法,因为您在接口PrivateNSURLSessionDelegate 上调用它。 但是,这没有被定义,因为它被定义为 NSConnect 被定义为实例方法(顺便说一句,(实例)方法总是以小写字母开头)。

[m_Delegate NSConnect];

但是调用实例方法。您应该在PrivateNSURLSessionDelegate 的头文件中定义-(bool)NSConnect,而不是在实现文件中的@implementation 上方,这会导致私有方法因此无法访问。

【讨论】:

  • 感谢您的快速回复!
  • 糟糕。并不是要按“输入”。所以我想要一个实例方法,然后应该是-(bool)NSConnect,它应该在@implementation 中?我在@interface 中定义了它。那是对的吗?抱歉,我真的很陌生。
  • 是的,这听起来很正确。例如参见this 教程,尤其是关于实现文件的部分。 @gnasher729 的答案可能更符合您的 c++ 问题。..
  • 我认为我是这样做的,但我仍然收到“无法识别的选择器发送到实例” - 也许这与我制作 m_Delegate 对象的方式有关?
  • 感谢您的链接。我一直在阅读该教程,它真的很棒!
猜你喜欢
  • 1970-01-01
  • 2011-05-26
  • 2012-02-09
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多